home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume26 / cook-1.4 / part05 < prev    next >
Encoding:
Text File  |  1993-05-03  |  89.1 KB  |  3,942 lines

  1. Newsgroups: comp.sources.unix
  2. From: pmiller@bmr.gov.au (Peter Miller)
  3. Subject: v26i213: cook-1.4 - a file construction tool (like "make"), Part05/11
  4. Sender: unix-sources-moderator@efficacy.home.vix.com
  5. Approved: WhoAmI@efficacy.home.vix.com
  6.  
  7. Submitted-By: pmiller@bmr.gov.au (Peter Miller)
  8. Posting-Number: Volume 26, Issue 213
  9. Archive-Name: cook-1.4/part05
  10.  
  11. #! /bin/sh
  12. # This is a shell archive.  Remove anything before this line, then unpack
  13. # it by saving it into a file and typing "sh file".  To overwrite existing
  14. # files, type "sh file -c".  You can also feed this as standard input via
  15. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  16. # will see the following message at the end:
  17. #        "End of archive 5 (of 11)."
  18. # Contents:  aux/BUILDING.man aux/Howto.cook aux/Makefile.sh
  19. #   common/error.c cook/glob.c cook/parse.y doc/builtin doc/system
  20. #   roffpp/preprocess.c
  21. # Wrapped by vixie@efficacy.home.vix.com on Tue May  4 01:36:39 1993
  22. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  23. if test -f 'aux/BUILDING.man' -a "${1}" != "-c" ; then 
  24.   echo shar: Will not clobber existing file \"'aux/BUILDING.man'\"
  25. else
  26. echo shar: Extracting \"'aux/BUILDING.man'\" \(9227 characters\)
  27. sed "s/^X//" >'aux/BUILDING.man' <<'END_OF_FILE'
  28. X'\" t
  29. X.\"    cook - file construction tool
  30. X.\"    Copyright (C) 1992, 1993 Peter Miller.
  31. X.\"    All rights reserved.
  32. X.\"
  33. X.\"    This program is free software; you can redistribute it and/or modify
  34. X.\"    it under the terms of the GNU General Public License as published by
  35. X.\"    the Free Software Foundation; either version 2 of the License, or
  36. X.\"    (at your option) any later version.
  37. X.\"
  38. X.\"    This program is distributed in the hope that it will be useful,
  39. X.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
  40. X.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  41. X.\"    GNU General Public License for more details.
  42. X.\"
  43. X.\"    You should have received a copy of the GNU General Public License
  44. X.\"    along with this program; if not, write to the Free Software
  45. X.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  46. X.\"
  47. X.\" MANIFEST: source of the BUILDING file
  48. X.\"
  49. X.TH building cook
  50. X.if n .hy 0
  51. X.if n .ad l
  52. X.if n .nr IN 8n
  53. X.SH NAME
  54. Xcook \- a file construction tool
  55. X.SH SPACE REQUIREMENTS
  56. XYou will need about 5MB to unpack and build the
  57. X.I cook
  58. Xprogram.
  59. XYour milage may vary.
  60. X.br
  61. X.ne 1i
  62. X.SH SITE CONFIGURATION
  63. XThe file
  64. X.I common/conf.h
  65. Xneeds to be created to match your site.
  66. XSelect an appropriate file from the
  67. X.I conf
  68. Xdirectory.
  69. XThe files in this directory are named for the various systems
  70. Xencountered to date by the author.
  71. XThe file most closely resembling your system should be copied into the
  72. X.I common/conf.h
  73. Xfile.
  74. XYou can copy it or use a symbolic link;
  75. Xcopying is recommended because you may need to edit.
  76. X.PP
  77. XA file which may require editing is the
  78. X.I Makefile
  79. Xfile.
  80. XThe first few lines contain comments describing what may require changing.
  81. XIn general these changes will relate to the name of your favorite
  82. XC compiler,
  83. Xand where it keeps its include files.
  84. X.br
  85. X.ne 1i
  86. X.SH KNOWN SYSTEMS
  87. XThis distribution of
  88. X.I cook
  89. Xis known to build on the following systems:
  90. X.TP 8n
  91. XSCO 3.2
  92. X.br
  93. XYou will need to set the compiler to
  94. X.I rcc
  95. Xin the
  96. X.I Makefile
  97. Xfile.
  98. X.TP 8n
  99. XSunOS 4.1
  100. X.br
  101. XThe native
  102. X.IR cc (1)
  103. Xand also
  104. X.IR gcc (1)
  105. Xare known to work.
  106. XThe appropriate configuration is contained in the
  107. X.I conf/SunOS-4.1
  108. Xfile.
  109. X.TP 8n
  110. XConvexOS 10.0
  111. X.br
  112. XThe native
  113. X.IR cc (1)
  114. Xis known to work.
  115. XThe appropriate configuration is contained in the
  116. X.I conf/ConvexOS-10
  117. Xfile.
  118. X.TP
  119. Xdgux 5.4.1
  120. X.br
  121. XThe native
  122. X.I cc (1)
  123. Xcompiler is known to work.
  124. XThe appropriate configuration is contained in the
  125. X.I conf/dgux-5.4.1
  126. Xfile.
  127. X.TP
  128. XPyramid SMP DC/OSx 1.0-92b023
  129. X.br
  130. XThis system is revolting!
  131. XThe Berkeley
  132. X.I cc (1)
  133. Xcompiler variant is known to work.
  134. XThe appropriate configuration is contained in the
  135. X.I conf/dcosx
  136. Xfile.
  137. XMake sure you read the
  138. X.I Makefile
  139. Xfile very carefully.
  140. X.TP
  141. XULTRIX 4.2
  142. X.br
  143. XThe native
  144. X.I cc (1)
  145. Xcompiler is known to work.
  146. XThe appropriate configuration is contained in the
  147. X.I conf/ULTRIX-4.2
  148. Xfile.
  149. XMake sure you set the
  150. X.I SHELL
  151. Xmacro in the
  152. X.I Makefile
  153. Xfile.
  154. X.PP
  155. XIf any of the above systems do not work for you,
  156. Xafter you have double-checked everything,
  157. Xthe author wants to know.
  158. X.SH UNKNOWN SYSTEMS
  159. XPlease let the author know of any other systems you get
  160. X.I cook
  161. Xworking on,
  162. Xand the modifications necessary.
  163. XPlease include the changes to the
  164. X.I Makefile
  165. Xfile,
  166. Xthe relevant
  167. X.I common/conf.h
  168. Xfile used,
  169. Xand the output of the "uname -rs" command.
  170. X.PP
  171. XThe
  172. X.I cook
  173. Xprogram was developed using gcc,
  174. Xhowever this is not the default in the
  175. X.I Makefile
  176. Xfile.
  177. XThe
  178. X.I cook
  179. Xprogram source attempts to use ANSI C features without compromising the ability
  180. Xto be compiled on older C compilers.
  181. XFunctions mandated by the ANSI C standard are used,
  182. Xbecause many systems provided them, one way or another.
  183. XPlease let the author know of any others you think should
  184. Xbe added to the
  185. X.I common/ansi.c
  186. Xfile.
  187. X.PP
  188. XYou may need to use some ANSI C header files which the
  189. X.I cook
  190. Xcode uses,
  191. Xbut which some systems (as yet) fail to provide.
  192. XYou will find lines at the top of the
  193. X.I Makefile
  194. Xfile similar to
  195. X.RS
  196. X.ft CW
  197. XH = -I/usr/include -Ih
  198. X.ft R
  199. X.RE
  200. XChange this to suit your system and your compiler.
  201. XThe "h" directory must be searched last as it is
  202. Xintended to suplement your system,
  203. Xnot replace it.
  204. X.PP
  205. XYou will need to check the include files in the "h" directory
  206. Xto see that they are suitable for your system.
  207. XYou may want to delete any that your system already has.
  208. X.br
  209. X.ne 1i
  210. X.SH BUILDING COOK
  211. XAll you should need to do is use the
  212. X.RS
  213. X.ft CW
  214. X.nf
  215. X% make
  216. X\fI\&...lots of output...\fP
  217. X%
  218. X.fi
  219. X.ft R
  220. X.RE
  221. Xcommand and wait.
  222. XWhen this finishes you should see a directory called
  223. X.I bin
  224. Xcontaining three files:
  225. X.IR cook ,
  226. X.IR c_incl
  227. Xand
  228. X.IR find_libs .
  229. XThe
  230. X.I c_incl
  231. Xprogram is a utility distributed with
  232. X.I cook
  233. Xwhich examines C files and determines all the files it includes
  234. Xdirectly and indirectly.
  235. XThe
  236. X.I find_libs
  237. Xprogram is a utility distributed with
  238. X.I cook
  239. Xwhich tracks doen the names of library files,
  240. Xgiven cc-style library options (-L and -l).
  241. X.br
  242. X.ne 1i
  243. X.SH TESTING
  244. XThe
  245. X.I cook
  246. Xprogram comes with a test suite.
  247. XTo run this test suite, use the command
  248. X.RS
  249. X.ft CW
  250. X.nf
  251. X% make sure
  252. X\fI\&...lots of output...\fP
  253. XPassed All Tests
  254. X%
  255. X.fi
  256. X.ft R
  257. X.RE
  258. X.PP
  259. XThe tests take a few seconds each,
  260. Xwith a few very fast,
  261. Xand a couple very slow,
  262. Xbut it varies greatly depending on your CPU.
  263. X.PP
  264. XIf all went well, the message
  265. X.RS
  266. X.ft CW
  267. XPassed All Tests
  268. X.ft R
  269. X.RE
  270. Xshould appear at the end of the make.
  271. X.br
  272. X.ne 1i
  273. X.SH INSTALLING COOK
  274. XPut the
  275. X.I cook
  276. Xprogram and utilities somewhere where users will automatically pick it up,
  277. Xsuch as in the
  278. X.I /usr/local/bin
  279. Xdirectory.
  280. XUse the command
  281. X.RS
  282. X.ft CW
  283. X.nf
  284. X# cp bin/* /usr/local/bin
  285. X#
  286. X.fi
  287. X.ft R
  288. X.RE
  289. X.PP
  290. XThe manuals can be installed using the commands
  291. X.RS
  292. X.ft CW
  293. X.nf
  294. X# sh man1/install.sh \fI/usr/local/man/man1\fP
  295. X#
  296. X.fi
  297. X.ft R
  298. X.RE
  299. XThis is very site-specific.
  300. XYou can install the manuals in a different directory
  301. Xby using a different last argument.
  302. X.PP
  303. XBy default,
  304. X.I cook
  305. Xis configured to use
  306. X.I /usr/local/lib/cook
  307. Xas the place it stores various system recipe files
  308. X.RS
  309. X.ft CW
  310. X.nf
  311. X# mkdir /usr/local/lib/cook
  312. X# cp lib/* /usr/local/lib/cook
  313. X#
  314. X.fi
  315. X.ft R
  316. X.RE
  317. XThese paths are only example, where to install things tends
  318. Xto be very system specific, and I won't even try to guess.
  319. XControl of the placement of this directory may be found in the first
  320. Xfew lines of the
  321. X.I Makefile
  322. Xfile.
  323. X.PP
  324. XAll of the above install can be done automatically,
  325. Xusing the "\f(CWmake install\fP" command.
  326. XControl of the directories used may be found in the first
  327. Xfew lines of the
  328. X.I Makefile
  329. Xfile.
  330. X.br
  331. X.ne 1i
  332. X.SH PRINTED MANUALS
  333. XThis distribution contains the sources to
  334. Xall of the documentation for
  335. X.IR cook .
  336. XThe author used the GNU groff package
  337. Xand a postscript printer to prepare the documentation.
  338. XIf you do not have this software,
  339. Xyou will need to substitute commands appropriate to your site.
  340. X.PP
  341. XTo print copies of the
  342. X.I README
  343. Xand
  344. X.I BUILDING
  345. Xfiles,
  346. Xthe following commands may be used
  347. X.RS
  348. X.ft CW
  349. X.nf
  350. X% cd aux
  351. X% groff -s -t -man *.man | lpr
  352. X% cd ..
  353. X%
  354. X.fi
  355. X.ft R
  356. X.RE
  357. XThis will produce about 4 pages.
  358. XThe "-s" flag means preprocess with
  359. X.IR soelim (1),
  360. Xand the "-t" flag means preprocess with
  361. X.IR tbl (1).
  362. X.PP
  363. XTo print copies of the manual entries,
  364. Xthe following commands may be used
  365. X.RS
  366. X.ft CW
  367. X.nf
  368. X% cd man1
  369. X% groff -s -t -man *.1 | lpr
  370. X% cd ..
  371. X%
  372. X.fi
  373. X.ft R
  374. X.RE
  375. XThis will produce about 8 pages.
  376. XThe "-s" flag means preprocess with
  377. X.IR soelim (1),
  378. Xand the "-t" flag means preprocess with
  379. X.IR tbl (1).
  380. X.PP
  381. XTo print a copy of the Reference Manual,
  382. Xthe following commands may be used
  383. X.RS
  384. X.ft CW
  385. X.nf
  386. X% cd doc
  387. X% groff -s -t -mm refman.t | lpr
  388. X% cd ..
  389. X%
  390. X.fi
  391. X.ft R
  392. X.RE
  393. XThis will produce about 35 pages.
  394. XThe "-s" flag means preprocess with
  395. X.IR soelim (1),
  396. Xthe "-t" flag means preprocess with
  397. X.IR tbl (1).
  398. XAlternatively,
  399. Xyou could get a PostScript copy of the Reference Manual from the archive site.
  400. X.br
  401. X.ne 1i
  402. X.SH GETTING HELP
  403. XIf you need assistance with the
  404. X.I cook
  405. Xprogram,
  406. Xplease do not hesitate to contact the author at
  407. X.RS
  408. X.ft CW
  409. XPeter Miller <pmiller@bmr.gov.au>
  410. X.ft R
  411. X.RE
  412. XAny and all feedback is welcome.
  413. X.PP
  414. XWhen reporting problems,
  415. Xplease include the version number
  416. Xgiven by the
  417. X.RS
  418. X.ft CW
  419. X.nf
  420. X% cook -version
  421. Xcook version \fIa.b.cccc\fP
  422. X\&...
  423. X%
  424. X.fi
  425. X.ft R
  426. X.RE
  427. Xcommand.
  428. X.PP
  429. XIn the
  430. X.I common/main.h
  431. Xfile, there is a define of
  432. X.I DEBUG
  433. Xin comments.
  434. XIf the comments are removed,
  435. Xextensive debugging is turned on.
  436. XThis causes some performance loss,
  437. Xbut performs much run-time checking
  438. Xand adds the
  439. X.B -TRACIng
  440. Xcommand line option.
  441. X.PP
  442. XWhen the
  443. X.B -TRACing
  444. Xoption is followed by one or more file names,
  445. Xit turns on execution traces in those source files.
  446. XIt is best to put this option on the end of the command,
  447. Xso that the names of the files to be traced are not confused
  448. Xwith any other filenames or strings on the command line.
  449. X.br
  450. X.ne 2i
  451. X.SH COPYRIGHT
  452. X.I cook
  453. Xversion
  454. X.so ../doc/version.so
  455. X.br
  456. XCopyright
  457. X.if n (C)
  458. X.if t \(co
  459. X1988, 1989, 1990, 1991, 1992, 1993 Peter Miller.
  460. X.br
  461. XAll rights reserved.
  462. X.PP
  463. XThe
  464. X.I cook
  465. Xpackage is distributed in the hope that it will be useful,
  466. Xbut WITHOUT ANY WARRANTY;
  467. Xwithout even the implied warranty of MERCHANTABILITY or
  468. XFITNESS FOR A PARTICULAR PURPOSE.
  469. XSee the GNU General Public License for more details.
  470. X.PP
  471. XIt should be in the
  472. X.I LICENSE
  473. Xfile included with this distribution.
  474. X.br
  475. X.ne 1i
  476. X.SH AUTHOR
  477. X.TS
  478. Xtab(;);
  479. Xl l l.
  480. XPeter Miller;UUCP;uunet!munnari!bmr.gov.au!pmiller
  481. X\f(CW/\e/\e*\fP;Internet;pmiller@bmr.gov.au
  482. X.TE
  483. END_OF_FILE
  484. if test 9227 -ne `wc -c <'aux/BUILDING.man'`; then
  485.     echo shar: \"'aux/BUILDING.man'\" unpacked with wrong size!
  486. fi
  487. # end of 'aux/BUILDING.man'
  488. fi
  489. if test -f 'aux/Howto.cook' -a "${1}" != "-c" ; then 
  490.   echo shar: Will not clobber existing file \"'aux/Howto.cook'\"
  491. else
  492. echo shar: Extracting \"'aux/Howto.cook'\" \(10497 characters\)
  493. sed "s/^X//" >'aux/Howto.cook' <<'END_OF_FILE'
  494. X/*
  495. X *    cook - file construction tool
  496. X *    Copyright (C) 1991, 1992, 1993 Peter Miller.
  497. X *    All rights reserved.
  498. X *
  499. X *    This program is free software; you can redistribute it and/or modify
  500. X *    it under the terms of the GNU General Public License as published by
  501. X *    the Free Software Foundation; either version 2 of the License, or
  502. X *    (at your option) any later version.
  503. X *
  504. X *    This program is distributed in the hope that it will be useful,
  505. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  506. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  507. X *    GNU General Public License for more details.
  508. X *
  509. X *    You should have received a copy of the GNU General Public License
  510. X *    along with this program; if not, write to the Free Software
  511. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  512. X *
  513. X * MANIFEST: instructions to cook, how to build project
  514. X */
  515. X
  516. X
  517. X/*
  518. X * You may want to change some of these options.
  519. X * ([debug] must be defined, even if empty, use comments.)
  520. X *
  521. X * If you want to turn the DEBUG compile flag on,
  522. X * edit the common/main.h file.
  523. X */
  524. Xdebug = /* -g */ ;
  525. Xoption_flags = -D\'LIBDIR\=\"/usr/local/lib/cook\"\';
  526. X
  527. X/*
  528. X * Make sure the [project], [change] and [version] variables are set.
  529. X */
  530. X#ifndef project
  531. Xecho "The [project] variable was not set from the command line." set silent;
  532. Xecho "If you want to do a build with is not a development build" set silent;
  533. Xecho "or an integration build, use the make command, not cook." set silent;
  534. Xfail;
  535. X#endif
  536. X#ifndef change
  537. Xecho "The [change] variable was not set from the command line." set silent;
  538. Xecho "If you want to do a build with is not a development build" set silent;
  539. Xecho "or an integration build, use the make command, not cook." set silent;
  540. Xfail;
  541. X#endif
  542. X#ifndef version
  543. Xecho "The [version] variable was not set from the command line." set silent;
  544. Xecho "If you want to do a build with is not a development build" set silent;
  545. Xecho "or an integration build, use the make command, not cook." set silent;
  546. Xfail;
  547. X#endif
  548. X
  549. X/*
  550. X * find the baseline
  551. X */
  552. Xif [match_mask %1C%2 [version]] then
  553. X{
  554. X    baseline = [collect aegis -cd -bl -p [project]];
  555. X    search_list = . [baseline];
  556. X}
  557. X
  558. X/*
  559. X * The source files.
  560. X * This is given to us by aegis.
  561. X */
  562. Xvs_file = common/patchlevel.h;
  563. Xchange_files =
  564. X    [collect aegis -l chafil -ter -p [project] -c [change]]
  565. X    [vs_file] doc/version.so
  566. X    ;
  567. Xproject_files =
  568. X    [collect aegis -l profil -ter -p [project] -c [change]]
  569. X    ;
  570. Xsource_files =
  571. X    [sort [stringset [project_files] [change_files]]]
  572. X    ;
  573. Xcommon_obj =
  574. X    [fromto common/%.c common/%.o [match_mask common/%.c [source_files]]]
  575. X    ;
  576. Xcook_obj =
  577. X    [fromto cook/%.y cook/%.gen.o [match_mask cook/%.y [source_files]] ]
  578. X    [fromto cook/%.c cook/%.o [match_mask cook/%.c [source_files]] ]
  579. X    [common_obj]
  580. X    ;
  581. Xc_incl_obj =
  582. X    [fromto c_incl/%.c c_incl/%.o [match_mask c_incl/%.c [source_files]] ]
  583. X    [common_obj]
  584. X    ;
  585. Xfind_libs_obj =
  586. X    [fromto
  587. X        find_libs/%.c
  588. X        find_libs/%.o
  589. X        [match_mask find_libs/%.c [source_files]]
  590. X    ]
  591. X    [common_obj]
  592. X    ;
  593. Xroffpp_obj =
  594. X    [fromto roffpp/%.c roffpp/%.o [match_mask roffpp/%.c [source_files]] ]
  595. X    [common_obj]
  596. X    ;
  597. Xcooktime_obj =
  598. X    [fromto
  599. X        cooktime/%.y
  600. X        cooktime/%.gen.o
  601. X        [match_mask cooktime/%.y [source_files]]
  602. X    ]
  603. X    [fromto
  604. X        cooktime/%.c
  605. X        cooktime/%.o
  606. X        [match_mask cooktime/%.c [source_files]]
  607. X    ]
  608. X    [common_obj]
  609. X    ;
  610. Xlib_srcs =
  611. X    [match_mask lib/% [source_files]]
  612. X    ;
  613. X
  614. X/*
  615. X * how to compile C sources
  616. X */
  617. Xcc = cc;
  618. Xcc_flags = -O [debug];
  619. Xcc_include_flags = ;
  620. X
  621. X/*
  622. X * this next section is for gcc
  623. X *    comment it out if you don't have gcc
  624. X *
  625. X * The gcc include files MUST be first.
  626. X */
  627. Xcc = gcc;
  628. Xcc_include_flags = -I/usr/local/lib/gcc-include [cc_include_flags];
  629. Xcc_flags = [cc_flags] -ansi -Wall -Wstrict-prototypes -Wmissing-prototypes;
  630. X
  631. X/*
  632. X * include files from the common directory.
  633. X */
  634. Xcc_include_flags = [cc_include_flags] [prepost "-I" "/common" [search_list]];
  635. X
  636. X/*
  637. X * Need to look at the ANSI include files which come with cook,
  638. X * but only after the system files.
  639. X * (Since they supplement system files, not replace them.)
  640. X * /
  641. Xcc_include_flags = [cc_include_flags] [prepost "-I" "/h" [search_list]];
  642. X */
  643. X
  644. X
  645. X/*
  646. X * Build %.o from %.c
  647. X */
  648. X%1/%2.o: %1/%2.c: [collect c_incl -eia -s [stringset [prepost "-I" "/%1"
  649. X    [search_list]] [cc_include_flags]] [resolve %1/%2.c]]
  650. X{
  651. X    if [not [exists %1]] then
  652. X        mkdir %1
  653. X            set clearstat;
  654. X    if [exists %1/%2.o] then
  655. X        rm %1/%2.o
  656. X            set clearstat;
  657. X    if [defined %2_flags] then
  658. X        extra = [%2_flags];
  659. X    else
  660. X        extra = ;
  661. X    [cc] [cc_flags] [extra] [stringset [prepost "-I" "/%1" [search_list]]
  662. X        [cc_include_flags]] -c [resolve %1/%2.c];
  663. X    mv %2.o %1/%2.o;
  664. X}
  665. X
  666. X
  667. X/*
  668. X * How to use yacc sources.
  669. X */
  670. Xyacc = yacc;
  671. Xyacc_flags = ;
  672. X
  673. X%1/%2.gen.c %1/%2.gen.h: %1/%2.y
  674. X{
  675. X    if [not [exists %1]] then
  676. X        mkdir %1
  677. X            set clearstat;
  678. X    if [exists %1/%2.list] then
  679. X        rm %1/%2.list
  680. X            set clearstat;
  681. X    if [exists y.output] then
  682. X        rm y.output
  683. X            set clearstat;
  684. X    if [exists %1/%2.gen.c] then
  685. X        rm %1/%2.gen.c
  686. X            set clearstat;
  687. X    if [exists %1/%2.gen.h] then
  688. X        rm %1/%2.gen.h
  689. X            set clearstat;
  690. X    [yacc] -d [yacc_flags] [resolve %1/%2.y];
  691. X    sed -e \'s/\[yY\]\[yY\]/%2_/g\' y.tab.c > %1/%2.gen.c;
  692. X    rm y.tab.c;
  693. X    sed -e \'s/\[yY\]\[yY\]/%2_/g\' y.tab.h > %1/%2.gen.h;
  694. X    rm y.tab.h;
  695. X    if [exists y.output] then
  696. X        mv y.output %1/%2.list
  697. X            set clearstat;
  698. X}
  699. X
  700. X
  701. X/*
  702. X * The default recipe
  703. X */
  704. Xall = doc.targets bin/cook bin/c_incl bin/find_libs bin/roffpp bin/cooktime;
  705. X
  706. X/*
  707. X * Integration builds also make the shar files for distribution.
  708. X */
  709. Xif [not [defined baseline]] then
  710. X    all = [all] archive/Part.01.Z archive/[project].tar.Z
  711. X        archive/[project].patch.Z;
  712. X
  713. Xall: [all];
  714. X
  715. X
  716. X/*
  717. X * build the programs
  718. X */
  719. Xbin/%: [%_obj]
  720. X{
  721. X    if [not [exists bin]] then
  722. X        mkdir bin
  723. X            set clearstat;
  724. X    if [exists [target]] then
  725. X        rm [target]
  726. X            set clearstat;
  727. X
  728. X    [cc] -o [target] [resolve [%_obj]];
  729. X    chmod og\=u-w [target];
  730. X}
  731. X
  732. X
  733. X/*
  734. X * The version stamp is to be updated for every 
  735. X * integration and development build.
  736. X * It is be be empty for archaeology builds (this isn't ideal,
  737. X * but avoids, for now, the distinction between archaeology fr the
  738. X * most recent build (probably for distribution) and for regression
  739. X * testing).
  740. X *
  741. X * The dependency on . means it will be re-built a little more
  742. X * often than strictly essential.
  743. X */
  744. X
  745. X#ifndef baseline
  746. X
  747. Xif [exists [vs_file]] then
  748. X    rm [vs_file]
  749. X        set clearstat;
  750. Xif [exists doc/version.so] then
  751. X    rm doc/version.so
  752. X        set clearstat;
  753. X
  754. X#endif
  755. X
  756. Xif [not [exists [vs_file]]] then
  757. X{
  758. X    if [not [exists [dirname [vs_file]]]] then
  759. X        mkdir [dirname [vs_file]]
  760. X            set clearstat;
  761. X    echo "'#define PATCHLEVEL \""[version]"\"'" > [vs_file]
  762. X        set clearstat;
  763. X}
  764. Xif [not [exists doc/version.so]] then
  765. X{
  766. X    if [not [exists doc]] then
  767. X        mkdir doc
  768. X            set clearstat;
  769. X    echo "'"[version]"'" > doc/version.so
  770. X        set clearstat;
  771. X    cooktime -m 2-Jan-70 doc/version.so;
  772. X}
  773. X
  774. X
  775. X/*
  776. X * These recipes are only expected to be exercised in an integration build.
  777. X * They will work sort-of-OK for a development build, but are incapable
  778. X * of constructing a useful development build Makefile.
  779. X */
  780. XMakefile: aux/Makefile.sh aux/Makefile.awk [vs_file]
  781. X{
  782. X    if [exists Makefile] then
  783. X        rm Makefile
  784. X            set clearstat;
  785. X    sh [resolve aux/Makefile.sh] [resolve [source_files]]
  786. X        | awk -f [resolve aux/Makefile.awk] > Makefile;
  787. X}
  788. X
  789. Xsource_file_order =
  790. X    README
  791. X    [sort
  792. X        [stringset
  793. X            BUILDING MANIFEST Makefile CHANGES [source_files]
  794. X        -
  795. X            README
  796. X        ]
  797. X    ]
  798. X    ;
  799. X
  800. Xarchive/Part.01.Z: [source_file_order]
  801. X{
  802. X    if [not [exists archive]] then
  803. X        mkdir archive
  804. X            set clearstat;
  805. X    parts = [glob "archive/Part.*"];
  806. X    if [parts] then
  807. X        rm [parts]
  808. X            set clearstat;
  809. X    /* assumes shar.3.49 available */
  810. X    shar -n[project] -a -c -oarchive/Part -L50
  811. X        -s "'Peter Miller <pmiller@bmr.gov.au>'"
  812. X        [resolve [source_file_order]];
  813. X    compress -v archive/Part.*;
  814. X}
  815. X
  816. Xarchive/[project].tar.Z: [source_file_order]
  817. X{
  818. X    if [not [exists archive]] then
  819. X        mkdir archive
  820. X            set clearstat;
  821. X    if [exists [target]] then
  822. X        rm [target]
  823. X            set clearstat;
  824. X    tar cf - [resolve [source_file_order]] |
  825. X    tardy -unu 0 -gnu 0 -una Peter -gna Miller -p [project] -ms 0644 -mc 022
  826. X        > archive/[project].tar;
  827. X    compress -v archive/[project].tar;
  828. X}
  829. X
  830. XCHANGES: aux/CHANGES.sh [vs_file]
  831. X{
  832. X    if [exists [target]] then
  833. X        rm [target]
  834. X            set clearstat;
  835. X    sh [resolve aux/CHANGES.sh] [project] > [target];
  836. X}
  837. X
  838. X%: aux/%.man
  839. X{
  840. X    if [exists [target]] then
  841. X        rm [target]
  842. X            set clearstat;
  843. X    roffpp [prepost "-I" "/doc" [search_list]] [resolve [need]]
  844. X        | groff -Tascii -t -P-hub -man > [target];
  845. X}
  846. X
  847. X/*
  848. X * link to the correct config file
  849. X */
  850. X
  851. X#ifndef baseline
  852. X
  853. Xif [exists common/conf.h] then
  854. X    rm common/conf.h
  855. X        set clearstat;
  856. X
  857. X#endif
  858. X
  859. Xif [not [exists common/conf.h]] then
  860. X{
  861. X    if [not [exists common]] then
  862. X        mkdir common;
  863. X    uname-os = [collect uname -s];
  864. X    uname-rel = [collect uname -r];
  865. X    echo "'#include <../conf/"[uname-os]-[uname-rel]">'" > common/conf.h;
  866. X    cooktime -m 2-Jan-70 common/conf.h
  867. X        set clearstat;
  868. X}
  869. X
  870. X/*
  871. X * formatting documents and manual entries
  872. X */
  873. Xdoc.targets: cat txt special;
  874. X
  875. X/*
  876. X * manual entries
  877. X */
  878. Xcat = [fromto man%1/%2.%1 cat%1/%2.%1 [match_mask man%1/%2.%1 [source_files]]];
  879. Xcat: [cat];
  880. X
  881. Xcat%1/%2.%1: man%1/%2.%1: [collect c_incl -r -eia [prepost "-I" "/man%1"
  882. X    [search_list]] [resolve man%1/%2.%1]]
  883. X{
  884. X    if [not [exists cat%1]] then
  885. X        mkdir cat%1
  886. X            set clearstat;
  887. X    if [exists [target]] then
  888. X        rm [target]
  889. X            set clearstat;
  890. X    roffpp [prepost "-I" "/man%1" [search_list]] [resolve man%1/%2.%1]
  891. X        | groff -Tascii -t -P-h -man > [target];
  892. X}
  893. X
  894. X
  895. X/*
  896. X * user manuals
  897. X */
  898. X
  899. Xtxt = [fromto doc/%.t doc/%.ps.Z [match_mask doc/%.t [source_files]]];
  900. Xtxt: [txt];
  901. X
  902. Xdoc/%.ps.Z: doc/%.t: [collect c_incl -r -eia [prepost "-I" "/doc"
  903. X    [search_list]] [resolve doc/%.t]]
  904. X{
  905. X    if [not [exists doc]] then
  906. X        mkdir doc
  907. X            set clearstat;
  908. X    if [exists [target]] then
  909. X        rm -f [target]
  910. X            set clearstat;
  911. X    roffpp [prepost "-I" "/doc" [search_list]] [resolve doc/%.t]
  912. X        | groff -p -t -mm | compress > doc/%.ps.Z; 
  913. X}
  914. X
  915. X
  916. X/*
  917. X * specials
  918. X */
  919. X
  920. Xspecial = [fromto aux/%.man % [match_mask aux/%.man [source_files]]];
  921. Xspecial: [special];
  922. X
  923. X%: aux/%.man: [collect c_incl -r -eia [prepost "-I" "/aux" [search_list]]
  924. X    [resolve aux/%.man]]
  925. X{
  926. X    if [exists [target]] then
  927. X        rm -f [target]
  928. X            set clearstat;
  929. X    roffpp [prepost "-I" "/aux" [search_list]] [resolve aux/%.man]
  930. X        | tbl | nroff -man > %; 
  931. X}
  932. X
  933. XMANIFEST: [source_files]
  934. X{
  935. X    if [exists [target]] then
  936. X        rm [target]
  937. X            set clearstat;
  938. X    sh [resolve aux/MANIFEST.sh] [resolve [source_file_order]] > [target];
  939. X}
  940. X
  941. Xarchive/[project].patch.Z: [source_file_order]
  942. X{
  943. X    if [not [exists archive]] then
  944. X        mkdir archive
  945. X            set clearstat;
  946. X    if [exists [target]] then
  947. X        rm [target]
  948. X            set clearstat;
  949. X    sh [resolve aux/patches.sh] [project] [change] | compress > [target];
  950. X}
  951. END_OF_FILE
  952. if test 10497 -ne `wc -c <'aux/Howto.cook'`; then
  953.     echo shar: \"'aux/Howto.cook'\" unpacked with wrong size!
  954. fi
  955. # end of 'aux/Howto.cook'
  956. fi
  957. if test -f 'aux/Makefile.sh' -a "${1}" != "-c" ; then 
  958.   echo shar: Will not clobber existing file \"'aux/Makefile.sh'\"
  959. else
  960. echo shar: Extracting \"'aux/Makefile.sh'\" \(8871 characters\)
  961. sed "s/^X//" >'aux/Makefile.sh' <<'END_OF_FILE'
  962. X#! /bin/sh
  963. X#
  964. X#    cook - file construction tool
  965. X#    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  966. X#    All rights reserved.
  967. X#
  968. X#    This program is free software; you can redistribute it and/or modify
  969. X#    it under the terms of the GNU General Public License as published by
  970. X#    the Free Software Foundation; either version 2 of the License, or
  971. X#    (at your option) any later version.
  972. X#
  973. X#    This program is distributed in the hope that it will be useful,
  974. X#    but WITHOUT ANY WARRANTY; without even the implied warranty of
  975. X#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  976. X#    GNU General Public License for more details.
  977. X#
  978. X#    You should have received a copy of the GNU General Public License
  979. X#    along with this program; if not, write to the Free Software
  980. X#    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  981. X#
  982. X# MANIFEST: shell script to generate Makefile file
  983. X#
  984. Xcook_files=
  985. Xc_incl_files=
  986. Xfind_libs_files=
  987. Xroffpp_files=
  988. Xcooktime_files=
  989. Xcommon=
  990. Xtest_files=
  991. Xclean_files=core
  992. Xecho  "#"
  993. Xecho  "# You may need to change this for your system."
  994. Xecho  "# The \`\`h'' directory supplements your system, not replacing it."
  995. Xecho  "# The first variation is for gcc when it isn't the native complier,"
  996. Xecho  "# the second variation is for systems with missing ANSI C include files,"
  997. Xecho  "# the third variation is for conforming ANSI C implementations."
  998. Xecho  "#"
  999. Xecho  "# H = -I/usr/local/lib/gcc-include -I/usr/include -Ih"
  1000. Xecho  "# H = -I/usr/include -Ih"
  1001. Xecho  "H ="
  1002. Xecho  "# H =                # SunOS"
  1003. Xecho  "# H =                # ConvexOS"
  1004. Xecho  "# H =                # dgux"
  1005. Xecho  "# H =                # dcosx"
  1006. Xecho  "# H =                # ULTRIX"
  1007. Xecho  ""
  1008. Xecho  "#"
  1009. Xecho  "# the name of the compiler to use"
  1010. Xecho  "#"
  1011. Xecho  "CC = cc"
  1012. Xecho  "# CC = gcc"
  1013. Xecho  "# CC = cc            # SunOS"
  1014. Xecho  "# CC = cc            # ConvexOS"
  1015. Xecho  "# CC = rcc            # SCO"
  1016. Xecho  "# CC = cc            # dgux"
  1017. Xecho  "# CC = /usr/ucb/cc        # dcosx"
  1018. Xecho  "# CC = cc            # ULTRIX"
  1019. Xecho
  1020. Xecho  "#"
  1021. Xecho  "# The compiler flags to use, except for include path."
  1022. Xecho  "#"
  1023. Xecho  "CFLAGS = -O"
  1024. Xecho  "# CFLAGS = -g"
  1025. Xecho  "# CFLAGS = -O            # SunOS"
  1026. Xecho  "# CFLAGS = -O            # ConvexOS"
  1027. Xecho  "# CFLAGS = -O            # dgux"
  1028. Xecho  "# CFLAGS = -O -Xt -U__STDC__    # dcosx"
  1029. Xecho  "# CFLAGS = -O -Wall -ansi    # gcc"
  1030. Xecho  "# CFLAGS = -O            # ULTRIX"
  1031. Xecho  ""
  1032. Xecho  "#"
  1033. Xecho  "# where to put the library directory"
  1034. Xecho  "#"
  1035. Xecho  "LIB = /usr/local/lib/cook"
  1036. Xecho  ""
  1037. Xecho  "#"
  1038. Xecho  "# where to put the executables"
  1039. Xecho  "#"
  1040. Xecho  "BIN = /usr/local/bin"
  1041. Xecho  ""
  1042. Xecho  "#"
  1043. Xecho  "# where to put the manuals"
  1044. Xecho  "#"
  1045. Xecho  "MAN = /usr/local/man"
  1046. Xecho  ""
  1047. Xecho  "#"
  1048. Xecho  "# Which yacc to use"
  1049. Xecho  "#"
  1050. Xecho  "YACC = yacc"
  1051. Xecho  "# YACC = bison -y        # GNU"
  1052. Xecho  "# YACC = byacc            # Berkeley yacc"
  1053. Xecho  ""
  1054. Xecho  "#"
  1055. Xecho  "# extra libraries required for your system"
  1056. Xecho  "#"
  1057. Xecho  "LIBRARIES ="
  1058. Xecho  "# LIBRARIES =            # SunOS"
  1059. Xecho  "# LIBRARIES =            # ConvexOS"
  1060. Xecho  "# LIBRARIES =            # dgux"
  1061. Xecho  "# LIBRARIES = -lucb        # dcosx"
  1062. Xecho  "# LIBRARIES =            # ULTRIX"
  1063. Xecho  "# LIBRARIES = -lbsd"
  1064. Xecho  ""
  1065. Xecho  "#"
  1066. Xecho  "# shell to use to run tests and commands"
  1067. Xecho  "#    Make sure there are no spaces after the definition,"
  1068. Xecho  "#    many falavours of make(1) can't cope with them."
  1069. Xecho  "#"
  1070. Xecho  "SHELL = /bin/sh"
  1071. Xecho  "# SHELL = /bin/sh        # SunOS"
  1072. Xecho  "# SHELL = /bin/sh        # ConvexOS"
  1073. Xecho  "# SHELL = /bin/sh        # dgux"
  1074. Xecho  "# SHELL = /bin/sh        # dcosx"
  1075. Xecho  "# SHELL = /bin/sh5        # ULTRIX"
  1076. Xecho  ""
  1077. Xecho  "# You should not need to alter anything below this point."
  1078. Xecho  "#------------------------------------------------------------"
  1079. Xecho  ""
  1080. Xecho  "all: bin/cook bin/c_incl bin/find_libs bin/roffpp bin/cooktime"
  1081. Xecho  ""
  1082. Xrm common/conf.h
  1083. Xfor file in $*
  1084. Xdo
  1085. X    case $file in
  1086. X
  1087. X    cook/*.y)
  1088. X        root=`basename $file .y`
  1089. X        dep=`bin/c_incl -Icook -Icommon -ns -nc $file`
  1090. X        echo ""
  1091. X        echo "cook/${root}.gen.c cook/${root}.gen.h: $file"
  1092. X        echo "    $(YACC) -d $file"
  1093. X        echo "    sed -e 's/[yY][yY]/${root}_/g' y.tab.c > cook/${root}.gen.c"
  1094. X        echo "    sed -e 's/[yY][yY]/${root}_/g' y.tab.h > cook/${root}.gen.h"
  1095. X        echo "    rm y.tab.c y.tab.h"
  1096. X        clean_files="$clean_files cook/${root}.gen.c cook/${root}.gen.h"
  1097. X
  1098. X        echo ""
  1099. X        echo "cook/${root}.gen.o: cook/${root}.gen.c" $dep
  1100. X        echo "    $(CC) $(CFLAGS) -Icook -Icommon $(H) -c cook/${root}.gen.c"
  1101. X        echo "    mv ${root}.gen.o cook/${root}.gen.o"
  1102. X        cook_files="$cook_files cook/${root}.gen.o"
  1103. X        clean_files="$clean_files cook/${root}.gen.o"
  1104. X        ;;
  1105. X
  1106. X    cook/*.c)
  1107. X        root=`basename $file .c`
  1108. X        dep=`bin/c_incl -nc -Icook -Icommon -ns $file`
  1109. X        if [ ${root} = option ]
  1110. X        then
  1111. X            libdir="-D'LIBDIR=\"$(LIB)\"'"
  1112. X        else
  1113. X            libdir=
  1114. X        fi
  1115. X        echo ""
  1116. X        echo "cook/${root}.o: $file" $dep
  1117. X        echo "    $(CC) $(CFLAGS) $libdir -Icook -Icommon $(H) -c $file"
  1118. X        echo "    mv ${root}.o cook"
  1119. X        cook_files="$cook_files cook/${root}.o"
  1120. X        clean_files="$clean_files cook/${root}.o"
  1121. X        ;;
  1122. X
  1123. X    c_incl/*.c)
  1124. X        root=`basename $file .c`
  1125. X        dep=`bin/c_incl -nc -Ic_incl -Icommon -ns $file`
  1126. X        echo ""
  1127. X        echo "c_incl/${root}.o: $file" $dep
  1128. X        echo "    $(CC) $(CFLAGS) -Ic_incl -Icommon $(H) -c $file"
  1129. X        echo "    mv ${root}.o c_incl"
  1130. X        c_incl_files="$c_incl_files c_incl/${root}.o"
  1131. X        clean_files="$clean_files c_incl/${root}.o"
  1132. X        ;;
  1133. X
  1134. X    find_libs/*.c)
  1135. X        root=`basename $file .c`
  1136. X        dep=`bin/c_incl -nc -Ifind_libs -Icommon -ns $file`
  1137. X        echo ""
  1138. X        echo "find_libs/${root}.o: $file" $dep
  1139. X        echo "    $(CC) $(CFLAGS) -Ifind_libs -Icommon $(H) -c $file"
  1140. X        echo "    mv ${root}.o find_libs"
  1141. X        find_libs_files="$find_libs_files find_libs/${root}.o"
  1142. X        clean_files="$clean_files find_libs/${root}.o"
  1143. X        ;;
  1144. X
  1145. X    roffpp/*.c)
  1146. X        root=`basename $file .c`
  1147. X        dep=`bin/c_incl -nc -Iroffpp -Icommon -ns $file`
  1148. X        echo ""
  1149. X        echo "roffpp/${root}.o: $file" $dep
  1150. X        echo "    $(CC) $(CFLAGS) -Iroffpp -Icommon $(H) -c $file"
  1151. X        echo "    mv ${root}.o roffpp"
  1152. X        roffpp_files="$roffpp_files roffpp/${root}.o"
  1153. X        clean_files="$clean_files roffpp/${root}.o"
  1154. X        ;;
  1155. X
  1156. X    cooktime/*.y)
  1157. X        root=`basename $file .y`
  1158. X        dep=`bin/c_incl -Icooktime -Icommon -ns -nc $file`
  1159. X        echo ""
  1160. X        echo "cooktime/${root}.gen.c cooktime/${root}.gen.h: $file"
  1161. X        echo "    $(YACC) -d $file"
  1162. X        echo "    sed -e 's/[yY][yY]/${root}_/g' y.tab.c > cooktime/${root}.gen.c"
  1163. X        echo "    sed -e 's/[yY][yY]/${root}_/g' y.tab.h > cooktime/${root}.gen.h"
  1164. X        echo "    rm y.tab.c y.tab.h"
  1165. X        clean_files="$clean_files cooktime/${root}.gen.c cooktime/${root}.gen.h"
  1166. X
  1167. X        echo ""
  1168. X        echo "cooktime/${root}.gen.o: cooktime/${root}.gen.c" $dep
  1169. X        echo "    $(CC) $(CFLAGS) -Icooktime -Icommon $(H) -c cooktime/${root}.gen.c"
  1170. X        echo "    mv ${root}.gen.o cooktime/${root}.gen.o"
  1171. X        cooktime_files="$cooktime_files cooktime/${root}.gen.o"
  1172. X        clean_files="$clean_files cooktime/${root}.gen.o"
  1173. X        ;;
  1174. X
  1175. X    cooktime/*.c)
  1176. X        root=`basename $file .c`
  1177. X        dep=`bin/c_incl -nc -Icooktime -Icommon -ns $file`
  1178. X        echo ""
  1179. X        echo "cooktime/${root}.o: $file" $dep
  1180. X        echo "    $(CC) $(CFLAGS) -Icooktime -Icommon $(H) -c $file"
  1181. X        echo "    mv ${root}.o cooktime"
  1182. X        cooktime_files="$cooktime_files cooktime/${root}.o"
  1183. X        clean_files="$clean_files cooktime/${root}.o"
  1184. X        ;;
  1185. X
  1186. X    common/*.c)
  1187. X        root=`basename $file .c`
  1188. X        dep=`bin/c_incl -nc -Icommon -ns $file`
  1189. X        echo ""
  1190. X        echo "common/${root}.o: $file" $dep
  1191. X        echo "    $(CC) $(CFLAGS) -Icommon $(H) -c $file"
  1192. X        echo "    mv ${root}.o common"
  1193. X        common_files="$common_files common/${root}.o"
  1194. X        clean_files="$clean_files common/${root}.o"
  1195. X        ;;
  1196. X
  1197. X    test/*/*)
  1198. X        root=`basename $file .sh`
  1199. X        echo ""
  1200. X        echo "${root}: all $file"
  1201. X        echo "    $(SHELL) $file"
  1202. X        test_files="$test_files ${root}"
  1203. X        ;;
  1204. X
  1205. X    *)
  1206. X        ;;
  1207. X    esac
  1208. Xdone
  1209. X
  1210. Xecho ""
  1211. Xecho "CookObj =" $cook_files
  1212. X
  1213. Xecho ""
  1214. Xecho "CommonObj =" $common_files
  1215. X
  1216. Xecho ""
  1217. Xecho "CInclObj =" $c_incl_files
  1218. X
  1219. Xecho ""
  1220. Xecho "FindLibsObj =" $find_libs_files
  1221. X
  1222. Xecho ""
  1223. Xecho "RoffppObj =" $roffpp_files
  1224. X
  1225. Xecho ""
  1226. Xecho "CooktimeObj =" $cooktime_files
  1227. X
  1228. Xecho ""
  1229. Xecho "bin/cook: $(CookObj) $(CommonObj)"
  1230. Xecho "    -if [ ! -d bin ]; then mkdir bin; fi"
  1231. Xecho "    $(CC) -o bin/cook $(CookObj) $(CommonObj) $(LIBRARIES)"
  1232. X
  1233. Xecho ""
  1234. Xecho "bin/c_incl: $(CInclObj) $(CommonObj)"
  1235. Xecho "    -if [ ! -d bin ]; then mkdir bin; fi"
  1236. Xecho "    $(CC) -o bin/c_incl $(CInclObj) $(CommonObj) $(LIBRARIES)"
  1237. X
  1238. Xecho ""
  1239. Xecho "bin/find_libs: $(FindLibsObj) $(CommonObj)"
  1240. Xecho "    -if [ ! -d bin ]; then mkdir bin; fi"
  1241. Xecho "    $(CC) -o bin/find_libs $(FindLibsObj) $(CommonObj) $(LIBRARIES)"
  1242. X
  1243. Xecho ""
  1244. Xecho "bin/roffpp: $(RoffppObj) $(CommonObj)"
  1245. Xecho "    -if [ ! -d bin ]; then mkdir bin; fi"
  1246. Xecho "    $(CC) -o bin/roffpp $(RoffppObj) $(CommonObj) $(LIBRARIES)"
  1247. X
  1248. Xecho ""
  1249. Xecho "bin/cooktime: $(CooktimeObj) $(CommonObj)"
  1250. Xecho "    -if [ ! -d bin ]; then mkdir bin; fi"
  1251. Xecho "    $(CC) -o bin/cooktime $(CooktimeObj) $(CommonObj) $(LIBRARIES)"
  1252. X
  1253. Xecho ""
  1254. Xecho "sure:" $test_files
  1255. Xecho "    @echo Passed All Tests"
  1256. X
  1257. Xecho ""
  1258. Xecho "clean:"
  1259. Xecho "    rm -f" $clean_files
  1260. X
  1261. Xecho ""
  1262. Xecho "clobber: clean"
  1263. Xecho "    rm -f bin/cook bin/c_incl bin/find_libs bin/roffpp bin/cooktime"
  1264. X
  1265. Xecho ""
  1266. Xecho "install: all"
  1267. Xecho "    chmod a+x bin/*"
  1268. Xecho "    cp bin/* $(BIN)"
  1269. Xecho "    $(SHELL) man1/install.sh $(MAN)/man1"
  1270. Xecho "    -mkdir $(LIB)"
  1271. Xecho "    -chmod a+rx $(LIB)"
  1272. Xecho "    chmod a+r lib/*"
  1273. Xecho "    cp lib/* $(LIB)"
  1274. X
  1275. Xexit 0
  1276. END_OF_FILE
  1277. if test 8871 -ne `wc -c <'aux/Makefile.sh'`; then
  1278.     echo shar: \"'aux/Makefile.sh'\" unpacked with wrong size!
  1279. fi
  1280. # end of 'aux/Makefile.sh'
  1281. fi
  1282. if test -f 'common/error.c' -a "${1}" != "-c" ; then 
  1283.   echo shar: Will not clobber existing file \"'common/error.c'\"
  1284. else
  1285. echo shar: Extracting \"'common/error.c'\" \(8777 characters\)
  1286. sed "s/^X//" >'common/error.c' <<'END_OF_FILE'
  1287. X/*
  1288. X *    cook - file construction tool
  1289. X *    Copyright (C) 1991, 1992, 1993 Peter Miller.
  1290. X *    All rights reserved.
  1291. X *
  1292. X *    This program is free software; you can redistribute it and/or modify
  1293. X *    it under the terms of the GNU General Public License as published by
  1294. X *    the Free Software Foundation; either version 2 of the License, or
  1295. X *    (at your option) any later version.
  1296. X *
  1297. X *    This program is distributed in the hope that it will be useful,
  1298. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  1299. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1300. X *    GNU General Public License for more details.
  1301. X *
  1302. X *    You should have received a copy of the GNU General Public License
  1303. X *    along with this program; if not, write to the Free Software
  1304. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1305. X *
  1306. X * MANIFEST: functions to report errors
  1307. X */
  1308. X
  1309. X#include <ctype.h>
  1310. X#include <errno.h>
  1311. X#include <stddef.h>
  1312. X#include <stdio.h>
  1313. X#include <stdlib.h>
  1314. X#include <string.h>
  1315. X
  1316. X#include <arglex.h>
  1317. X#include <error.h>
  1318. X#include <s-v-arg.h>
  1319. X
  1320. X
  1321. Xstatic char *huge_buffer;
  1322. X
  1323. X
  1324. Xstatic void make_huge_buffer _((void));
  1325. X
  1326. Xstatic void
  1327. Xmake_huge_buffer()
  1328. X{
  1329. X    static int entry_count;
  1330. X    
  1331. X    if (huge_buffer)
  1332. X        return;
  1333. X    entry_count++;
  1334. X    if (entry_count != 1)
  1335. X    {
  1336. X        static char small_buffer[100];
  1337. X
  1338. X        /* just enuf for "out of memory" message */
  1339. X        huge_buffer = small_buffer;
  1340. X    }
  1341. X    else
  1342. X    {
  1343. X        huge_buffer = malloc(100000L);
  1344. X        if (!huge_buffer)
  1345. X            fatal("can't alloc buffer for error messages");
  1346. X    }
  1347. X    entry_count--;
  1348. X}
  1349. X
  1350. X
  1351. X/*
  1352. X * NAME
  1353. X *    wrap - wrap s string over lines
  1354. X *
  1355. X * SYNOPSIS
  1356. X *    void wrap(char *);
  1357. X *
  1358. X * DESCRIPTION
  1359. X *    The wrap function is used to print error messages onto stderr
  1360. X *    wrapping ling lines.
  1361. X *
  1362. X * CAVEATS
  1363. X *    Line length is assumed to be 80 characters.
  1364. X */
  1365. X
  1366. X#define PAGE_WIDTH 79
  1367. X
  1368. Xstatic void wrap _((char *));
  1369. X
  1370. Xstatic void
  1371. Xwrap(s)
  1372. X    char    *s;
  1373. X{
  1374. X    static char escapes[] = "\rr\nn\ff\bb\tt";
  1375. X    char    tmp[PAGE_WIDTH + 2];
  1376. X    int    first_line;
  1377. X    char    *tp;
  1378. X    int    bomb_later;
  1379. X    
  1380. X    /*
  1381. X     * Flush stdout so that errors are in sync with the output.
  1382. X     * If you get an error doing this, whinge about it _after_ reporting
  1383. X     * the originating error.  Also, clear the error on stdout to 
  1384. X     * avoid getting caught in an infinite loop.
  1385. X     */
  1386. X    if (fflush(stdout) || ferror(stdout))
  1387. X    {
  1388. X        bomb_later = errno;
  1389. X        clearerr(stdout);
  1390. X    }
  1391. X    else
  1392. X        bomb_later = 0;
  1393. X
  1394. X    first_line = 1;
  1395. X    while (*s)
  1396. X    {
  1397. X        char    *ep;
  1398. X        int    ocol;
  1399. X
  1400. X        /*
  1401. X         * Work out how many characters fit on the line.
  1402. X         */
  1403. X        if (first_line)
  1404. X            ocol = strlen(progname) + 2;
  1405. X        else
  1406. X            ocol = 8;
  1407. X        for (ep = s; *ep; ++ep)
  1408. X        {
  1409. X            int    cw;
  1410. X            int    c;
  1411. X
  1412. X            c = (unsigned char)*ep;
  1413. X            if (isprint(c))
  1414. X                cw = 1 + (c == '\\');
  1415. X            else
  1416. X                cw = (strchr(escapes, c) ? 2 : 4);
  1417. X            if (ocol + cw > PAGE_WIDTH)
  1418. X                break;
  1419. X            ocol += cw;
  1420. X        }
  1421. X
  1422. X        /*
  1423. X         * see if there is a better place to break the line
  1424. X         */
  1425. X        if (*ep && *ep != ' ')
  1426. X        {
  1427. X            char    *mp;
  1428. X
  1429. X            for (mp = ep; mp > s; --mp)
  1430. X            {
  1431. X                if (strchr(" /", mp[-1]))
  1432. X                {
  1433. X                    ep = mp;
  1434. X                    break;
  1435. X                }
  1436. X            }
  1437. X        }
  1438. X
  1439. X        /*
  1440. X         * ignore trailing blanks
  1441. X         */
  1442. X        while (ep > s && ep[-1] == ' ')
  1443. X            ep--;
  1444. X        
  1445. X        /*
  1446. X         * print the line
  1447. X         */
  1448. X        if (first_line)
  1449. X            sprintf(tmp, "%s: ", progname);
  1450. X        else
  1451. X            strcpy(tmp, "\t");
  1452. X        tp = tmp + strlen(tmp);
  1453. X        while (s < ep)
  1454. X        {
  1455. X            int    c;
  1456. X
  1457. X            c = (unsigned char)*s++;
  1458. X            if (isprint(c))
  1459. X            {
  1460. X                if (c == '\\')
  1461. X                    *tp++ = '\\';
  1462. X                *tp++ = c;
  1463. X            }
  1464. X            else
  1465. X            {
  1466. X                char    *esc;
  1467. X
  1468. X                esc = strchr(escapes, c);
  1469. X                if (esc)
  1470. X                {
  1471. X                    *tp++ = '\\';
  1472. X                    *tp++ = esc[1];
  1473. X                }
  1474. X                else
  1475. X                {
  1476. X                    sprintf(tp, "\\%3.3o", c);
  1477. X                    tp += strlen(tp);
  1478. X                }
  1479. X            }
  1480. X        }
  1481. X        *tp++ = '\n';
  1482. X        *tp = 0;
  1483. X        fputs(tmp, stderr);
  1484. X        if (ferror(stderr))
  1485. X            break;
  1486. X
  1487. X        /*
  1488. X         * skip leading spaces for subsequent lines
  1489. X         */
  1490. X        while (*s == ' ')
  1491. X            s++;
  1492. X        first_line = 0;
  1493. X    }
  1494. X    if (fflush(stderr) || ferror(stderr))
  1495. X    {
  1496. X        /* don't print why, there is no point! */
  1497. X        quit(1);
  1498. X    }
  1499. X    if (bomb_later)
  1500. X    {
  1501. X        errno = bomb_later;
  1502. X        nfatal("(stdout)");
  1503. X    }
  1504. X}
  1505. X
  1506. X
  1507. X/*
  1508. X * NAME
  1509. X *    error - place a message on the error stream
  1510. X *
  1511. X * SYNOPSIS
  1512. X *    void error(char *s, ...);
  1513. X *
  1514. X * DESCRIPTION
  1515. X *    Error places a message on the error output stream.
  1516. X *    The first argument is a printf-like format string,
  1517. X *    optionally followed by other arguments.
  1518. X *    The message will be prefixed by the program name and a colon,
  1519. X *    and will be terminated with a newline, automatically.
  1520. X *
  1521. X * CAVEAT
  1522. X *    Things like "error(filename)" blow up if the filename
  1523. X *    contains a '%' character.
  1524. X */
  1525. X
  1526. X/*VARARGS1*/
  1527. Xvoid
  1528. Xerror(s sva_last)
  1529. X    char        *s;
  1530. X    sva_last_decl
  1531. X{
  1532. X    va_list        ap;
  1533. X
  1534. X    make_huge_buffer();
  1535. X    sva_init(ap, s);
  1536. X    vsprintf(huge_buffer, s, ap);
  1537. X    va_end(ap);
  1538. X    wrap(huge_buffer);
  1539. X}
  1540. X
  1541. X
  1542. X/*
  1543. X * NAME
  1544. X *    nerror - place a system fault message on the error stream
  1545. X *
  1546. X * SYNOPSIS
  1547. X *    void nerror(char *s, ...);
  1548. X *
  1549. X * DESCRIPTION
  1550. X *    Nerror places a message on the error output stream.
  1551. X *    The first argument is a printf-like format string,
  1552. X *    optionally followed by other arguments.
  1553. X *    The message will be prefixed by the program name and a colon,
  1554. X *    and will be terminated with a text description of the error
  1555. X *    indicated by the 'errno' global variable, automatically.
  1556. X *
  1557. X * CAVEAT
  1558. X *    Things like "nerror(filename)" blow up if the filename
  1559. X *    contains a '%' character.
  1560. X */
  1561. X
  1562. X/*VARARGS1*/
  1563. Xvoid
  1564. Xnerror(s sva_last)
  1565. X    char        *s;
  1566. X    sva_last_decl
  1567. X{
  1568. X    va_list        ap;
  1569. X    int        n;
  1570. X
  1571. X    n = errno;
  1572. X    make_huge_buffer();
  1573. X    sva_init(ap, s);
  1574. X    vsprintf(huge_buffer, s, ap);
  1575. X    va_end(ap);
  1576. X    strcat(huge_buffer, ": ");
  1577. X    strcat(huge_buffer, strerror(n));
  1578. X    wrap(huge_buffer);
  1579. X}
  1580. X
  1581. X
  1582. X/*
  1583. X * NAME
  1584. X *    nfatal - place a system fault message on the error stream and exit
  1585. X *
  1586. X * SYNOPSIS
  1587. X *    void nfatal(char *s, ...);
  1588. X *
  1589. X * DESCRIPTION
  1590. X *    Nfatal places a message on the error output stream and exits.
  1591. X *    The first argument is a printf-like format string,
  1592. X *    optionally followed by other arguments.
  1593. X *    The message will be prefixed by the program name and a colon,
  1594. X *    and will be terminated with a text description of the error
  1595. X *    indicated by the 'errno' global variable, automatically.
  1596. X *
  1597. X * CAVEAT
  1598. X *    Things like "nfatal(filename)" blow up if the filename
  1599. X *    contains a '%' character.
  1600. X *
  1601. X *    This function does NOT return.
  1602. X */
  1603. X
  1604. X/*VARARGS1*/
  1605. Xvoid
  1606. Xnfatal(s sva_last)
  1607. X    char        *s;
  1608. X    sva_last_decl
  1609. X{
  1610. X    va_list        ap;
  1611. X    int        n;
  1612. X
  1613. X    n = errno;
  1614. X    make_huge_buffer();
  1615. X    sva_init(ap, s);
  1616. X    vsprintf(huge_buffer, s, ap);
  1617. X    va_end(ap);
  1618. X    strcat(huge_buffer, ": ");
  1619. X    strcat(huge_buffer, strerror(n));
  1620. X    wrap(huge_buffer);
  1621. X    quit(1);
  1622. X}
  1623. X
  1624. X
  1625. X/*
  1626. X * NAME
  1627. X *    fatal - place a message on the error stream and exit
  1628. X *
  1629. X * SYNOPSIS
  1630. X *    void fatal(char *s, ...);
  1631. X *
  1632. X * DESCRIPTION
  1633. X *    Fatal places a message on the error output stream and exits.
  1634. X *    The first argument is a printf-like format string,
  1635. X *    optionally followed by other arguments.
  1636. X *    The message will be prefixed by the program name and a colon,
  1637. X *    and will be terminated with a newline, automatically.
  1638. X *
  1639. X * CAVEAT
  1640. X *    Things like "error(filename)" blow up if the filename
  1641. X *    contains a '%' character.
  1642. X *
  1643. X *    This function does NOT return.
  1644. X */
  1645. X
  1646. X/*VARARGS1*/
  1647. Xvoid
  1648. Xfatal(s sva_last)
  1649. X    char        *s;
  1650. X    sva_last_decl
  1651. X{
  1652. X    va_list        ap;
  1653. X
  1654. X    make_huge_buffer();
  1655. X    sva_init(ap, s);
  1656. X    vsprintf(huge_buffer, s, ap);
  1657. X    va_end(ap);
  1658. X    wrap(huge_buffer);
  1659. X    quit(1);
  1660. X}
  1661. X
  1662. X
  1663. X/*
  1664. X * NAME
  1665. X *    assert - make an assertion
  1666. X *
  1667. X * SYNOPSIS
  1668. X *    void assert(int condition);
  1669. X *
  1670. X * DESCRIPTION
  1671. X *    Assert is a handy tool for a programmer to guarantee the internal
  1672. X *    consistency of their program.  If "-DDEBUG" is specified on
  1673. X *    the compiler's command line, then assert will generate code to verify
  1674. X *    the assertios made. If no DEBUG is defined, assertions will generate
  1675. X *    no code.
  1676. X *
  1677. X * CAVEAT
  1678. X *    If the assertion fails, a fatal diagnostic is issued.
  1679. X *
  1680. X *    The #define's which control the compilation may be found in "error.h".
  1681. X *
  1682. X */
  1683. X
  1684. X#ifdef    DEBUG
  1685. X
  1686. Xvoid
  1687. Xcook_assert(c, s, file, line)
  1688. X    int    c;
  1689. X    char    *s;
  1690. X    char    *file;
  1691. X    int    line;
  1692. X{
  1693. X    if (c)
  1694. X        return;
  1695. X    error("%s: %d: assertion \"%s\" failed (bug)", file, line, s);
  1696. X    abort();
  1697. X}
  1698. X
  1699. X#endif /* DEBUG */
  1700. X
  1701. X
  1702. X/*
  1703. X * NAME
  1704. X *    quit_handler
  1705. X *
  1706. X * SYNOPSIS
  1707. X *    int quit_handler(quit_ty);
  1708. X *
  1709. X * DESCRIPTION
  1710. X *    The quit_handler function registers the function pointed to by func,
  1711. X *    to be called without arguments at normal program termination.
  1712. X */
  1713. X
  1714. Xstatic    quit_ty    quit_list[32];
  1715. Xstatic    int    quit_list_length;
  1716. X
  1717. Xvoid
  1718. Xquit_handler(f)
  1719. X    quit_ty    f;
  1720. X{
  1721. X    assert(quit_list_length < SIZEOF(quit_list));
  1722. X    quit_list[quit_list_length++] = f;
  1723. X}
  1724. X
  1725. X
  1726. X/*
  1727. X * NAME
  1728. X *    quit - leave program
  1729. X *
  1730. X * SYNOPSIS
  1731. X *    void quit(int status);
  1732. X *
  1733. X * DESCRIPTION
  1734. X *    The quit function causes normal program termination to occur.
  1735. X *
  1736. X *    First, all functions registered by the quit_handler function are
  1737. X *    called, in the reverse order of their registration.
  1738. X *
  1739. X *    Next, the program is terminated using the exit() function.
  1740. X *
  1741. X * CAVEAT
  1742. X *    The quit function never returns to its caller.
  1743. X */
  1744. X
  1745. Xvoid
  1746. Xquit(n)
  1747. X    int    n;
  1748. X{
  1749. X    while (quit_list_length > 0)
  1750. X        (*quit_list[--quit_list_length])();
  1751. X    exit(n);
  1752. X}
  1753. END_OF_FILE
  1754. if test 8777 -ne `wc -c <'common/error.c'`; then
  1755.     echo shar: \"'common/error.c'\" unpacked with wrong size!
  1756. fi
  1757. # end of 'common/error.c'
  1758. fi
  1759. if test -f 'cook/glob.c' -a "${1}" != "-c" ; then 
  1760.   echo shar: Will not clobber existing file \"'cook/glob.c'\"
  1761. else
  1762. echo shar: Extracting \"'cook/glob.c'\" \(9323 characters\)
  1763. sed "s/^X//" >'cook/glob.c' <<'END_OF_FILE'
  1764. X/*
  1765. X *    cook - file construction tool
  1766. X *    Copyright (C) 1991, 1992, 1993 Peter Miller.
  1767. X *    All rights reserved.
  1768. X *
  1769. X *    This program is free software; you can redistribute it and/or modify
  1770. X *    it under the terms of the GNU General Public License as published by
  1771. X *    the Free Software Foundation; either version 2 of the License, or
  1772. X *    (at your option) any later version.
  1773. X *
  1774. X *    This program is distributed in the hope that it will be useful,
  1775. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  1776. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1777. X *    GNU General Public License for more details.
  1778. X *
  1779. X *    You should have received a copy of the GNU General Public License
  1780. X *    along with this program; if not, write to the Free Software
  1781. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1782. X *
  1783. X * MANIFEST: functions to perform shell-style file pattern matching
  1784. X */
  1785. X
  1786. X#include <sys/types.h>
  1787. X#include <dirent.h>
  1788. X
  1789. X#include <stddef.h>
  1790. X#include <string.h>
  1791. X#include <errno.h>
  1792. X#include <stdlib.h>
  1793. X
  1794. X#include <conf.h>
  1795. X#include <glob.h>
  1796. X#include <trace.h>
  1797. X#include <mem.h>
  1798. X#include <error.h>
  1799. X
  1800. X
  1801. Xstatic    char    *original;
  1802. Xstatic    wlist    *where;
  1803. Xstatic    char    *tmp;
  1804. Xstatic    size_t    tmp_max;
  1805. Xstatic    size_t    tmp_len;
  1806. X
  1807. X
  1808. X/*
  1809. X * NAME
  1810. X *    tmp_char - append character
  1811. X *
  1812. X * SYNOPSIS
  1813. X *    void tmp_char(int c);
  1814. X *
  1815. X * DESCRIPTION
  1816. X *    The tmp_char function is used to append a character to the string being
  1817. X *    built by the glob function.
  1818. X *
  1819. X * RETURNS
  1820. X *    void
  1821. X */
  1822. X
  1823. Xstatic void tmp_char _((int));
  1824. X
  1825. Xstatic void
  1826. Xtmp_char(c)
  1827. X    int        c;
  1828. X{
  1829. X    if (tmp_len >= tmp_max)
  1830. X    {
  1831. X        tmp_max += 128;
  1832. X        if (!tmp)
  1833. X            tmp = mem_alloc(tmp_max);
  1834. X        else
  1835. X            mem_change_size(&tmp, tmp_max);
  1836. X    }
  1837. X    tmp[tmp_len++] = c;
  1838. X}
  1839. X
  1840. X
  1841. X/*
  1842. X * NAME
  1843. X *    gmatch - match entryname pattern
  1844. X *
  1845. X * SYNOPSIS
  1846. X *    int gmatch(char *formal, char *formal_end, char *actual);
  1847. X *
  1848. X * DESCRIPTION
  1849. X *    The formal strings is used as a template to match the given actual
  1850. X *    string against.
  1851. X *
  1852. X *    The pattern elements understood are
  1853. X *    *    match zero or more of any character
  1854. X *    ?    match any single character
  1855. X *    [^xxx]    match any single character not in the set given.
  1856. X *    [xxx]    match any single character not in the set given.
  1857. X *            The - character is understood to be a range indicator.
  1858. X *            If the ] character is the first of the set it is considered
  1859. X *            as part of the set, not the terminator.
  1860. X *
  1861. X * RETURNS
  1862. X *    the gmatch function returns zero if they do not match,
  1863. X *    and nonzero if they do.  Returns -1 on error.
  1864. X *
  1865. X * CAVEAT
  1866. X *    This is a limited set of the sh(1) patterns.
  1867. X *    Assumes that the `original' global variable has been initialized, it is
  1868. X *    used for error reporting.
  1869. X */
  1870. X
  1871. Xstatic int gmatch _((char *, char *, char *));
  1872. X
  1873. Xstatic int
  1874. Xgmatch(formal, formal_end, actual)
  1875. X    char        *formal;
  1876. X    char        *formal_end;
  1877. X    char        *actual;
  1878. X{
  1879. X    char        *cp;
  1880. X    int         result;
  1881. X
  1882. X    trace(("gmatch(formal = %08lX, formal_end = %08lX, actual = %08lX)\n{\n"/*}*/, formal, formal_end, actual));
  1883. X    while (formal < formal_end)
  1884. X    {
  1885. X        trace(("formal == \"%.*s\";\n", formal_end - formal, formal));
  1886. X        trace(("actual = \"%s\";\n", actual));
  1887. X        switch (*formal)
  1888. X        {
  1889. X        default:
  1890. X            if (*actual++ != *formal++)
  1891. X            {
  1892. X                result = 0;
  1893. X                goto ret;
  1894. X            }
  1895. X            break;
  1896. X
  1897. X        case '?':
  1898. X            if (!*actual++)
  1899. X            {
  1900. X                result = 0;
  1901. X                goto ret;
  1902. X            }
  1903. X            ++formal;
  1904. X            break;
  1905. X
  1906. X        case '*':
  1907. X            cp = actual + strlen(actual);
  1908. X            ++formal;
  1909. X            for (;;)
  1910. X            {
  1911. X                if (gmatch(formal, formal_end, cp))
  1912. X                {
  1913. X                    result = 1;
  1914. X                    goto ret;
  1915. X                }
  1916. X                --cp;
  1917. X                if (cp < actual)
  1918. X                {
  1919. X                    result = 0;
  1920. X                    goto ret;
  1921. X                }
  1922. X            }
  1923. X
  1924. X        case '[':
  1925. X            ++formal;
  1926. X            if (*formal == '^')
  1927. X            {
  1928. X                ++formal;
  1929. X                for (;;)
  1930. X                {
  1931. X                    if (formal >= formal_end)
  1932. X                    {
  1933. X                        no_close:
  1934. X                        error("pattern \"%s\" missing closing ']'", original);
  1935. X                        result = -1;
  1936. X                        goto ret;
  1937. X                    }
  1938. X                    /* note: this allows leading ']' elegantly */
  1939. X                    if
  1940. X                    (
  1941. X                        formal_end >= formal + 3
  1942. X                    &&
  1943. X                        formal[1] == '-'
  1944. X                    &&
  1945. X                        formal[2] != ']'
  1946. X                    )
  1947. X                    {
  1948. X                        char    c1;
  1949. X                        char    c2;
  1950. X
  1951. X                        c1 = formal[0];
  1952. X                        c2 = formal[2];
  1953. X                        formal += 3;
  1954. X                        if
  1955. X                        (
  1956. X                            c1 <= c2
  1957. X                        ?
  1958. X                            (c1 <= *actual && *actual <= c2)
  1959. X                        :
  1960. X                            (c2 <= *actual && *actual <= c1)
  1961. X                        )
  1962. X                        {
  1963. X                            result = 0;
  1964. X                            goto ret;
  1965. X                        }
  1966. X                    }
  1967. X                    else
  1968. X                    if (*actual == *formal++)
  1969. X                    {
  1970. X                        result = 0;
  1971. X                        goto ret;
  1972. X                    }
  1973. X                    if (*formal == ']')
  1974. X                        break;
  1975. X                }
  1976. X                ++formal;
  1977. X            }
  1978. X            else
  1979. X            {
  1980. X                for (;;)
  1981. X                {
  1982. X                    if (formal >= formal_end)
  1983. X                        goto no_close;
  1984. X                    /* note: this allows leading ']' elegantly */
  1985. X                    trace(("formal == \"%.*s\";\n", formal_end - formal, formal));
  1986. X                    trace(("actual = \"%s\";\n", actual));
  1987. X                    if
  1988. X                    (
  1989. X                        formal_end >= formal + 3
  1990. X                    &&
  1991. X                        formal[1] == '-'
  1992. X                    &&
  1993. X                        formal[2] != ']'
  1994. X                    )
  1995. X                    {
  1996. X                        char    c1;
  1997. X                        char    c2;
  1998. X
  1999. X                        c1 = formal[0];
  2000. X                        c2 = formal[2];
  2001. X                        formal += 3;
  2002. X                        if
  2003. X                        (
  2004. X                            c1 <= c2
  2005. X                        ?
  2006. X                            (c1 <= *actual && *actual <= c2)
  2007. X                        :
  2008. X                            (c2 <= *actual && *actual <= c1)
  2009. X                        )
  2010. X                            break;
  2011. X                    }
  2012. X                    else
  2013. X                    if (*actual == *formal++)
  2014. X                        break;
  2015. X                    if (*formal == ']')
  2016. X                    {
  2017. X                        result = 0;
  2018. X                        goto ret;
  2019. X                    }
  2020. X                }
  2021. X                for (;;)
  2022. X                {
  2023. X                    if (formal >= formal_end)
  2024. X                        goto no_close;
  2025. X                    trace(("formal == \"%.*s\";\n", formal_end - formal, formal));
  2026. X                    trace(("actual = \"%s\";\n", actual));
  2027. X                    if (*formal++ == ']')
  2028. X                        break;
  2029. X                }
  2030. X            }
  2031. X            ++actual;
  2032. X            break;
  2033. X        }
  2034. X    }
  2035. X    result = (*actual == 0);
  2036. X    ret:
  2037. X    trace(("return %d;\n", result));
  2038. X    trace((/*{*/"}\n"));
  2039. X    return result;
  2040. X}
  2041. X
  2042. X
  2043. X/*
  2044. X * NAME
  2045. X *    globber - file name expander
  2046. X *
  2047. X * SYNOPSIS
  2048. X *    int globber(char *formal);
  2049. X *
  2050. X * DESCRIPTION
  2051. X *    The globber function is used to generate a list of file names from the
  2052. X *    given `formal' pattern.  Results are appended to the word list pointed
  2053. X *    to the global `where' variable.
  2054. X *
  2055. X * RETURNS
  2056. X *    int; 0 on success, -1 on error.
  2057. X *
  2058. X * CAVEAT
  2059. X *    Assumes that the `where' global variable has been initialized.
  2060. X */
  2061. X
  2062. Xstatic int globber _((char *));
  2063. X
  2064. Xstatic int
  2065. Xglobber(formal)
  2066. X    char        *formal;
  2067. X{
  2068. X    char        *formal_end;
  2069. X    char        *cp;
  2070. X    int         retval;
  2071. X
  2072. X    trace(("globber(formal = %08lX)\n{\n"/*}*/, formal));
  2073. X    trace_string(formal);
  2074. X    retval = 0;
  2075. X    for (;;)
  2076. X    {
  2077. X        while (*formal == '/')
  2078. X            tmp_char(*formal++);
  2079. X        formal_end = strchr(formal, '/');
  2080. X        if (!formal_end)
  2081. X            formal_end = formal + strlen(formal);
  2082. X        for (cp = formal; cp < formal_end; ++cp)
  2083. X            if (strchr("[?*", *cp))
  2084. X                break;
  2085. X        if (cp >= formal_end)
  2086. X        {
  2087. X            /* nothing special */
  2088. X            trace(("ordinary = \"%.*s\"", formal_end - formal, formal));
  2089. X            for (cp = formal; cp < formal_end; ++cp)
  2090. X                tmp_char(*cp);
  2091. X            if (!*cp)
  2092. X            {
  2093. X                string_ty *s;
  2094. X
  2095. X                s = str_n_from_c(tmp, tmp_len);
  2096. X                wl_append(where, s);
  2097. X                str_free(s);
  2098. X                break;
  2099. X            }
  2100. X            formal = formal_end;
  2101. X        }
  2102. X        else
  2103. X        {
  2104. X            size_t        n;
  2105. X            DIR        *dp;
  2106. X            struct dirent    *dep;
  2107. X
  2108. X            /* need to expand wild characters */
  2109. X            trace(("expand = \"%.*s\"", formal_end - formal, formal));
  2110. X            n = tmp_len;
  2111. X            tmp_char(0);
  2112. X            dp = opendir(tmp[0] ? tmp : ".");
  2113. X            if (!dp)
  2114. X            {
  2115. X                if (errno == ENOTDIR)
  2116. X                    break;
  2117. X                nerror("%s", tmp);
  2118. X                retval = -1;
  2119. X                goto ret;
  2120. X            }
  2121. X            tmp_len = n;
  2122. X            for (;;)
  2123. X            {
  2124. X                char    *np;
  2125. X
  2126. X                dep = readdir(dp);
  2127. X                if (!dep)
  2128. X                    break;
  2129. X                np = dep->d_name;
  2130. X#ifdef CONF_pyramid_broken_readdir
  2131. X                np -= 2;
  2132. X#endif
  2133. X                if
  2134. X                (
  2135. X                    np[0] == '.'
  2136. X                &&
  2137. X                    (
  2138. X                        !np[1]
  2139. X                    ||
  2140. X                        (np[1] == '.' && !np[2])
  2141. X                    )  
  2142. X                )
  2143. X                    continue;
  2144. X                switch (gmatch(formal, formal_end, np))
  2145. X                {
  2146. X                case 0:
  2147. X                    continue;
  2148. X
  2149. X                case -1:
  2150. X                    retval = -1;
  2151. X                    goto ret;
  2152. X                }
  2153. X                for (cp = np; *cp; ++cp)
  2154. X                    tmp_char(*cp);
  2155. X                if (!*formal_end)
  2156. X                {
  2157. X                    string_ty *s;
  2158. X
  2159. X                    s = str_n_from_c(tmp, tmp_len);
  2160. X                    wl_append(where, s);
  2161. X                    str_free(s);
  2162. X                }
  2163. X                else
  2164. X                {
  2165. X                    tmp_char('/');
  2166. X                    if (globber(formal_end + 1))
  2167. X                    {
  2168. X                        closedir(dp);
  2169. X                        retval = -1;
  2170. X                        goto ret;
  2171. X                    }
  2172. X                }
  2173. X                tmp_len = n;
  2174. X            }
  2175. X            closedir(dp);
  2176. X            break;
  2177. X        }
  2178. X    }
  2179. X    ret:
  2180. X    trace(("return %d;\n", retval));
  2181. X    trace((/*{*/"}\n"));
  2182. X    return retval;
  2183. X}
  2184. X
  2185. X
  2186. X/*
  2187. X * NAME
  2188. X *    cmp - compare strings
  2189. X *
  2190. X * SYNOPSIS
  2191. X *    int cmp(string_ty **, string_ty **);
  2192. X *
  2193. X * DESCRIPTION
  2194. X *    The cmp function is used to compare two strings.
  2195. X *
  2196. X * RETURNS
  2197. X *    int; <0 if a<b, 0 if a==b, >0 if a>b
  2198. X *
  2199. X * CAVEAT
  2200. X *    Intended for use by qsort.
  2201. X */
  2202. X
  2203. Xstatic int cmp _((const void *, const void *));
  2204. X
  2205. Xstatic int
  2206. Xcmp(va, vb)
  2207. X    const void    *va;
  2208. X    const void    *vb;
  2209. X{
  2210. X    string_ty    *a;
  2211. X    string_ty    *b;
  2212. X
  2213. X    a = *(string_ty **)va;
  2214. X    b = *(string_ty **)vb;
  2215. X    return strcmp(a->str_text, b->str_text);
  2216. X}
  2217. X
  2218. X
  2219. X/*
  2220. X * NAME
  2221. X *    glob - builtin function for expanding file names
  2222. X *
  2223. X * SYNOPSIS
  2224. X *    void glob(wlist *result, wlist *args);
  2225. X *
  2226. X * DESCRIPTION
  2227. X *    The glob function is used to implement the "glob" builtin function of
  2228. X *    cook to expand file name patterns.
  2229. X *
  2230. X * RETURNS
  2231. X *    void
  2232. X *
  2233. X * CAVEAT
  2234. X *    This function is designed to be used as a "builtin" function.
  2235. X */
  2236. X
  2237. Xint
  2238. Xglob(result, args)
  2239. X    wlist        *result;
  2240. X    wlist        *args;
  2241. X{
  2242. X    int        j;
  2243. X    int        start;
  2244. X    int        retval;
  2245. X
  2246. X    trace(("glob(result = %08X, args = %08X)\n{\n"/*}*/, result, args));
  2247. X    retval = 0;
  2248. X    where = result;
  2249. X    for (j = 1; j < args->wl_nwords; ++j)
  2250. X    {
  2251. X        tmp_len = 0;
  2252. X        original = args->wl_word[j]->str_text;
  2253. X        start = result->wl_nwords;
  2254. X        if (globber(original))
  2255. X        {
  2256. X            retval = -1;
  2257. X            break;
  2258. X        }
  2259. X        qsort(result->wl_word + start, result->wl_nwords - start, sizeof(string_ty *), cmp);
  2260. X    }
  2261. X    trace(("return %d;\n", retval));
  2262. X    trace((/*{*/"}\n"));
  2263. X    return retval;
  2264. X}
  2265. END_OF_FILE
  2266. if test 9323 -ne `wc -c <'cook/glob.c'`; then
  2267.     echo shar: \"'cook/glob.c'\" unpacked with wrong size!
  2268. fi
  2269. # end of 'cook/glob.c'
  2270. fi
  2271. if test -f 'cook/parse.y' -a "${1}" != "-c" ; then 
  2272.   echo shar: Will not clobber existing file \"'cook/parse.y'\"
  2273. else
  2274. echo shar: Extracting \"'cook/parse.y'\" \(9370 characters\)
  2275. sed "s/^X//" >'cook/parse.y' <<'END_OF_FILE'
  2276. X/*
  2277. X *    cook - file construction tool
  2278. X *    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  2279. X *    All rights reserved.
  2280. X *
  2281. X *    This program is free software; you can redistribute it and/or modify
  2282. X *    it under the terms of the GNU General Public License as published by
  2283. X *    the Free Software Foundation; either version 2 of the License, or
  2284. X *    (at your option) any later version.
  2285. X *
  2286. X *    This program is distributed in the hope that it will be useful,
  2287. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  2288. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2289. X *    GNU General Public License for more details.
  2290. X *
  2291. X *    You should have received a copy of the GNU General Public License
  2292. X *    along with this program; if not, write to the Free Software
  2293. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  2294. X *
  2295. X * MANIFEST: functions to parse cookbooks
  2296. X */
  2297. X
  2298. X%token    CATENATE
  2299. X%token    COLON
  2300. X%token    DATA
  2301. X%token    DATAEND
  2302. X%token    ELSE
  2303. X%token    EQUALS
  2304. X%token    FAIL
  2305. X%token    IF
  2306. X%token    LBRACE
  2307. X%token    LBRAK
  2308. X%token    LOOP
  2309. X%token    LOOPSTOP
  2310. X%token    RBRACE
  2311. X%token    RBRAK
  2312. X%token    SEMICOLON
  2313. X%token    SET
  2314. X%token    THEN
  2315. X%token    UNSETENV
  2316. X%token    WORD
  2317. X
  2318. X%right    ELSE
  2319. X%left    CATENATE
  2320. X
  2321. X%{
  2322. X#include <stddef.h>
  2323. X#include <stdlib.h>
  2324. X#include <stdio.h>
  2325. X
  2326. X#include <cook.h>
  2327. X#include <expr.h>
  2328. X#include <id.h>
  2329. X#include <lex.h>
  2330. X#include <mem.h>
  2331. X#include <option.h>
  2332. X#include <parse.h>
  2333. X#include <stmt.h>
  2334. X#include <trace.h>
  2335. X#include <word.h>
  2336. X
  2337. X#ifdef    DEBUG
  2338. X#define YYDEBUG 1
  2339. X#define printf trace_where(__FILE__, __LINE__), lex_trace
  2340. Xextern int yydebug;
  2341. X#endif
  2342. X
  2343. Xstatic    stmt    *looptemp;
  2344. X
  2345. X
  2346. X/*
  2347. X *  NAME
  2348. X *      parse_initialize - start up parser
  2349. X *
  2350. X *  SYNOPSIS
  2351. X *      void parse_initialize(void);
  2352. X *
  2353. X *  DESCRIPTION
  2354. X *      The parse_initialize function is used to add the set clause names to
  2355. X *      the symbol table.
  2356. X *
  2357. X *  RETURNS
  2358. X *      void
  2359. X *
  2360. X *  CAVEAT
  2361. X *      Must be called after symbol table is initialized.
  2362. X *      Must be called before the parse function is used.
  2363. X */
  2364. X
  2365. Xvoid
  2366. Xparse_initialize()
  2367. X{
  2368. X    typedef struct table_ty table_ty;
  2369. X    struct table_ty
  2370. X    {
  2371. X        char    *t_name;
  2372. X        int    t_mask;
  2373. X    };
  2374. X
  2375. X    static table_ty table[] =
  2376. X    {
  2377. X        { "errok",        RF_ERROK,        },
  2378. X        { "noerrok",        RF_ERROK_OFF,        },
  2379. X        { "force",        RF_FORCE,        },
  2380. X        { "forced",        RF_FORCE,        },
  2381. X        { "noforce",        RF_FORCE_OFF,        },
  2382. X        { "noforced",        RF_FORCE_OFF,        },
  2383. X        { "meter",        RF_METER,        },
  2384. X        { "nometer",        RF_METER_OFF,        },
  2385. X        { "precious",        RF_PRECIOUS,        },
  2386. X        { "noprecious",        RF_PRECIOUS_OFF,    },
  2387. X        { "silent",        RF_SILENT,        },
  2388. X        { "nosilent",        RF_SILENT_OFF,        },
  2389. X        { "clearstat",        RF_CLEARSTAT,        },
  2390. X        { "noclearstat",    RF_CLEARSTAT_OFF,    },
  2391. X    };
  2392. X
  2393. X    table_ty *tp;
  2394. X
  2395. X    trace(("parse_initialize()\n{\n"/*}*/));
  2396. X    for (tp = table; tp < ENDOF(table); ++tp)
  2397. X    {
  2398. X        string_ty *s;
  2399. X
  2400. X        s = str_from_c(tp->t_name);
  2401. X        id_assign(s, ID_CLASS_FLAGS, &tp->t_mask);
  2402. X        str_free(s);
  2403. X    }
  2404. X    trace((/*{*/"}\n"));
  2405. X}
  2406. X
  2407. X
  2408. X/*
  2409. X *  NAME
  2410. X *    parse - read and process a cookbook
  2411. X *
  2412. X *  SYNOPSIS
  2413. X *    void parse(string_ty *filename);
  2414. X *
  2415. X *  DESCRIPTION
  2416. X *    Parse reads and processes a cookbook.
  2417. X *
  2418. X *  CAVEAT
  2419. X *    If any errors are found, the user will be told,
  2420. X *    and this routine will not return.
  2421. X */
  2422. X
  2423. Xvoid
  2424. Xparse(filename)
  2425. X    string_ty *filename;
  2426. X{
  2427. X    int yyparse _((void)); /* forward */
  2428. X
  2429. X    trace(("parse(filename = %08lX)\n{\n"/*}*/, filename));
  2430. X    trace_string(filename->str_text);
  2431. X    lex_open(filename);
  2432. X#if YYDEBUG
  2433. X    yydebug = trace_pretest_;
  2434. X#endif
  2435. X    yyparse();
  2436. X    lex_close();
  2437. X    trace((/*{*/"}\n"));
  2438. X}
  2439. X
  2440. X#define yyerror lex_error
  2441. X
  2442. X%}
  2443. X
  2444. X%union
  2445. X{
  2446. X    expr        *lv_expr;
  2447. X    stmt        *lv_stmt;
  2448. X    elist        lv_elist;
  2449. X    string_ty    *lv_word;
  2450. X    int        lv_flag;
  2451. X    position    lv_position;
  2452. X}
  2453. X
  2454. X%type    <lv_stmt>    statement compound_statement statements
  2455. X%type    <lv_stmt>    command simple_command loop use_clause
  2456. X%type    <lv_elist>    elist exprs
  2457. X%type    <lv_word>    WORD
  2458. X%type    <lv_expr>    expr if_clause
  2459. X%type    <lv_flag>    set_clause data lbrak mult
  2460. X%type    <lv_position>    COLON
  2461. X
  2462. X%%
  2463. X
  2464. Xcook
  2465. X    : /* empty */
  2466. X    | cook statement
  2467. X        {
  2468. X            if (stmt_eval($2))
  2469. X                yyerror("statement failed");
  2470. X            stmt_free($2);
  2471. X        }
  2472. X    | cook error
  2473. X        {
  2474. X            lex_mode(LM_NORMAL);
  2475. X        }
  2476. X    ;
  2477. X
  2478. Xstatement
  2479. X    : compound_statement
  2480. X        {
  2481. X            $$ = $1;
  2482. X        }
  2483. X    | UNSETENV exprs SEMICOLON
  2484. X        {
  2485. X            $$ = stmt_alloc();
  2486. X            $$->s_op = OP_UNSETENV;
  2487. X            $$->s_cmd.c_args = $2;
  2488. X        }
  2489. X    | elist EQUALS exprs SEMICOLON
  2490. X        {
  2491. X            $$ = stmt_alloc();
  2492. X            $$->s_op = OP_ASSIGN;
  2493. X            $$->s_assign.a_name = $1;
  2494. X            $$->s_assign.a_value = $3;
  2495. X        }
  2496. X    | elist COLON mult exprs set_clause if_clause compound_statement
  2497. X            use_clause
  2498. X        {
  2499. X            $$ = stmt_alloc();
  2500. X            $$->s_op = OP_RECIPE;
  2501. X            $$->s_recipe.sr_target = $1;
  2502. X            $$->s_recipe.sr_position = $2;
  2503. X            $$->s_recipe.sr_multiple = $3;
  2504. X            $$->s_recipe.sr_need = $4;
  2505. X            el_zero(&$$->s_recipe.sr_need2);
  2506. X            $$->s_recipe.sr_flags = $5;
  2507. X            $$->s_recipe.sr_precondition = $6;
  2508. X            $$->s_recipe.sr_action = $7;
  2509. X            $$->s_recipe.sr_use_action = $8;
  2510. X        }
  2511. X    | elist COLON mult exprs COLON exprs set_clause if_clause
  2512. X            compound_statement use_clause
  2513. X        {
  2514. X            $$ = stmt_alloc();
  2515. X            $$->s_op = OP_RECIPE;
  2516. X            $$->s_recipe.sr_target = $1;
  2517. X            $$->s_recipe.sr_position = $2;
  2518. X            $$->s_recipe.sr_multiple = $3;
  2519. X            $$->s_recipe.sr_need = $4;
  2520. X            $$->s_recipe.sr_need2 = $6;
  2521. X            $$->s_recipe.sr_flags = $7;
  2522. X            $$->s_recipe.sr_precondition = $8;
  2523. X            $$->s_recipe.sr_action = $9;
  2524. X            $$->s_recipe.sr_use_action = $10;
  2525. X            str_free($5.pos_name);
  2526. X        }
  2527. X    | elist COLON mult exprs set_clause if_clause SEMICOLON
  2528. X        {
  2529. X            $$ = stmt_alloc();
  2530. X            $$->s_op = OP_RECIPE;
  2531. X            $$->s_recipe.sr_target = $1;
  2532. X            $$->s_recipe.sr_position = $2;
  2533. X            $$->s_recipe.sr_need = $4;
  2534. X            el_zero(&$$->s_recipe.sr_need2);
  2535. X            $$->s_recipe.sr_flags = $5;
  2536. X            $$->s_recipe.sr_precondition = $6;
  2537. X            $$->s_recipe.sr_action = 0;
  2538. X            $$->s_recipe.sr_use_action = 0;
  2539. X            $$->s_recipe.sr_multiple = $3;
  2540. X        }
  2541. X    ;
  2542. X
  2543. Xmult
  2544. X    : /* empty */
  2545. X        {
  2546. X            $$ = 0;
  2547. X        }
  2548. X    | COLON
  2549. X        {
  2550. X            $$ = 1;
  2551. X            str_free($1.pos_name);
  2552. X        }
  2553. X    ;
  2554. X
  2555. Xset_clause
  2556. X    : /* empty */
  2557. X        {
  2558. X            $$ = 0;
  2559. X        }
  2560. X    | SET exprs
  2561. X        {
  2562. X            int    flag;
  2563. X            int    j;
  2564. X            wlist    wl;
  2565. X
  2566. X            wl_zero(&wl);
  2567. X            if (el2wl(&wl, &$2))
  2568. X            {
  2569. X                /* error message already emitted */
  2570. X                wl_free(&wl);
  2571. X            }
  2572. X            el_free(&$2);
  2573. X            $$ = 0;
  2574. X            if (!wl.wl_nwords)
  2575. X                yyerror("set clause has no flags");
  2576. X            for (j = 0; j < wl.wl_nwords; ++j)
  2577. X            {
  2578. X                if (id_search(wl.wl_word[j], ID_CLASS_FLAGS, &flag))
  2579. X                    $$ |= flag;
  2580. X                else
  2581. X                {
  2582. X                    yyerror
  2583. X                    (
  2584. X                   "set clause does not understand \"%s\" flag",
  2585. X                        wl.wl_word[j]->str_text
  2586. X                    );
  2587. X                }
  2588. X            }
  2589. X            wl_free(&wl);
  2590. X        }
  2591. X    ;
  2592. X
  2593. Xif_clause
  2594. X    : /* empty */
  2595. X        {
  2596. X            $$ = 0;
  2597. X        }
  2598. X    | IF expr
  2599. X        {
  2600. X            $$ = $2;
  2601. X        }
  2602. X    ;
  2603. X
  2604. Xuse_clause
  2605. X    : /* empty */
  2606. X        {
  2607. X            $$ = 0;
  2608. X        }
  2609. X    | THEN compound_statement
  2610. X        {
  2611. X            $$ = $2;
  2612. X        }
  2613. X    ;
  2614. X
  2615. Xstatement
  2616. X    : command
  2617. X        {
  2618. X            $$ = $1;
  2619. X        }
  2620. X    | IF expr THEN statement
  2621. X        %prec ELSE
  2622. X        {
  2623. X            $$ = stmt_alloc();
  2624. X            $$->s_op = OP_IF;
  2625. X            $$->s_if.sif_cond = $2;
  2626. X            $$->s_if.sif_true = $4;
  2627. X            $$->s_if.sif_false = stmt_alloc();
  2628. X            $$->s_if.sif_false->s_op = OP_NOP;
  2629. X        }
  2630. X    | IF expr THEN statement ELSE statement
  2631. X        {
  2632. X            $$ = stmt_alloc();
  2633. X            $$->s_op = OP_IF;
  2634. X            $$->s_if.sif_cond = $2;
  2635. X            $$->s_if.sif_true = $4;
  2636. X            $$->s_if.sif_false = $6;
  2637. X        }
  2638. X    | loop statement
  2639. X        {
  2640. X            $$ = looptemp;
  2641. X            looptemp = $1;
  2642. X            $$->s_op = OP_LOOP;
  2643. X            $$->s_loop = $2;
  2644. X        }
  2645. X    | LOOPSTOP SEMICOLON
  2646. X        {
  2647. X            $$ = stmt_alloc();
  2648. X            if (!looptemp)
  2649. X            {
  2650. X                yyerror("'loopstop' encountered outside a loop");
  2651. X                $$->s_op = OP_NOP;
  2652. X            }
  2653. X            else
  2654. X                $$->s_op = OP_LOOPSTOP;
  2655. X        }
  2656. X    | SET exprs SEMICOLON
  2657. X        {
  2658. X            int    j;
  2659. X            int    flag;
  2660. X            wlist   wl;
  2661. X
  2662. X            $$ = stmt_alloc();
  2663. X            $$->s_op = OP_SET;
  2664. X            $$->s_cmd.c_flags = 0;
  2665. X
  2666. X            wl_zero(&wl);
  2667. X            if (el2wl(&wl, &$2))
  2668. X            {
  2669. X                /* error message already emitted */
  2670. X                wl_free(&wl);
  2671. X            }
  2672. X            el_free(&$2);
  2673. X            if (!wl.wl_nwords)
  2674. X                yyerror("set statement has no flags");
  2675. X            for (j = 0; j < wl.wl_nwords; ++j)
  2676. X            {
  2677. X                if (id_search(wl.wl_word[j], ID_CLASS_FLAGS, &flag))
  2678. X                    $$->s_cmd.c_flags |= flag;
  2679. X                else
  2680. X                {
  2681. X                    yyerror
  2682. X                    (
  2683. X                "set statement does not understand \"%s\" flag",
  2684. X                        wl.wl_word[j]->str_text
  2685. X                    );
  2686. X                }
  2687. X            }
  2688. X            wl_free(&wl);
  2689. X        }
  2690. X    | FAIL SEMICOLON
  2691. X        {
  2692. X            $$ = stmt_alloc();
  2693. X            $$->s_op = OP_FAIL;
  2694. X        }
  2695. X    | FAIL WORD SEMICOLON
  2696. X        {
  2697. X            $$ = stmt_alloc();
  2698. X            $$->s_op = OP_FAIL_DK;
  2699. X        }
  2700. X    | SEMICOLON
  2701. X        {
  2702. X            $$ = stmt_alloc();
  2703. X            $$->s_op = OP_NOP;
  2704. X        }
  2705. X    ;
  2706. X
  2707. Xloop
  2708. X    : LOOP
  2709. X        {
  2710. X            $$ = looptemp;
  2711. X            looptemp = stmt_alloc();
  2712. X        }
  2713. X    ;
  2714. X
  2715. Xcompound_statement
  2716. X    : LBRACE statements RBRACE
  2717. X        {
  2718. X            $$ = $2;
  2719. X        }
  2720. X    ;
  2721. X
  2722. Xstatements
  2723. X    : /* empty */
  2724. X        {
  2725. X            $$ = stmt_alloc();
  2726. X            $$->s_op = OP_COMPOUND;
  2727. X        }
  2728. X    | statements statement
  2729. X        {
  2730. X            $$ = $1;
  2731. X            sl_append(&$$->s_list, $2);
  2732. X            stmt_free($2);
  2733. X        }
  2734. X    | statements error
  2735. X        {
  2736. X            $$ = $1;
  2737. X        }
  2738. X    ;
  2739. X
  2740. Xelist
  2741. X    : expr
  2742. X        {
  2743. X            el_zero(&$$);
  2744. X            el_append(&$$, $1);
  2745. X            expr_free($1);
  2746. X        }
  2747. X    | elist expr
  2748. X        {
  2749. X            $$ = $1;
  2750. X            el_append(&$$, $2);
  2751. X            expr_free($2);
  2752. X        }
  2753. X    ;
  2754. X
  2755. Xexprs
  2756. X    : /* empty */
  2757. X        {
  2758. X            el_zero(&$$);
  2759. X        }
  2760. X    | exprs expr
  2761. X        {
  2762. X            $$ = $1;
  2763. X            el_append(&$$, $2);
  2764. X            expr_free($2);
  2765. X        }
  2766. X    ;
  2767. X
  2768. Xexpr
  2769. X    : WORD
  2770. X        {
  2771. X            $$ = expr_alloc();
  2772. X            $$->e_op = OP_WORD;
  2773. X            $$->e_word = $1;
  2774. X        }
  2775. X    | lbrak elist RBRAK
  2776. X        {
  2777. X            lex_mode($1);
  2778. X            $$ = expr_alloc();
  2779. X            $$->e_op = OP_FUNC;
  2780. X            $$->e_list = $2;
  2781. X        }
  2782. X    | expr CATENATE expr
  2783. X        {
  2784. X            $$ = expr_alloc();
  2785. X            $$->e_op = OP_CAT;
  2786. X            $$->e_left = $1;
  2787. X            $$->e_right = $3;
  2788. X        }
  2789. X    ;
  2790. X
  2791. Xcommand
  2792. X    : simple_command
  2793. X        {
  2794. X            $$ = $1;
  2795. X        }
  2796. X    | simple_command data expr DATAEND
  2797. X        {
  2798. X            lex_mode($2);
  2799. X            $$ = $1;
  2800. X            $$->s_cmd.c_input = $3;
  2801. X        }
  2802. X    ;
  2803. X
  2804. Xsimple_command
  2805. X    : elist set_clause SEMICOLON
  2806. X        {
  2807. X            $$ = stmt_alloc();
  2808. X            $$->s_op = OP_COMMAND;
  2809. X            $$->s_cmd.c_args = $1;
  2810. X            $$->s_cmd.c_flags = $2;
  2811. X        }
  2812. X    ;
  2813. X
  2814. Xdata
  2815. X    : DATA
  2816. X        {
  2817. X            $$ = lex_mode(LM_DATA);
  2818. X        }
  2819. X    ;
  2820. X
  2821. Xlbrak
  2822. X    : LBRAK
  2823. X        {
  2824. X            $$ = lex_mode(LM_NORMAL);
  2825. X        }
  2826. X    ;
  2827. END_OF_FILE
  2828. if test 9370 -ne `wc -c <'cook/parse.y'`; then
  2829.     echo shar: \"'cook/parse.y'\" unpacked with wrong size!
  2830. fi
  2831. # end of 'cook/parse.y'
  2832. fi
  2833. if test -f 'doc/builtin' -a "${1}" != "-c" ; then 
  2834.   echo shar: Will not clobber existing file \"'doc/builtin'\"
  2835. else
  2836. echo shar: Extracting \"'doc/builtin'\" \(8061 characters\)
  2837. sed "s/^X//" >'doc/builtin' <<'END_OF_FILE'
  2838. X.\"
  2839. X.\"    cook - file construction tool
  2840. X.\"    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  2841. X.\"    All rights reserved.
  2842. X.\"
  2843. X.\"    This program is free software; you can redistribute it and/or modify
  2844. X.\"    it under the terms of the GNU General Public License as published by
  2845. X.\"    the Free Software Foundation; either version 2 of the License, or
  2846. X.\"    (at your option) any later version.
  2847. X.\"
  2848. X.\"    This program is distributed in the hope that it will be useful,
  2849. X.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
  2850. X.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2851. X.\"    GNU General Public License for more details.
  2852. X.\"
  2853. X.\"    You should have received a copy of the GNU General Public License
  2854. X.\"    along with this program; if not, write to the Free Software
  2855. X.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  2856. X.\"
  2857. X.\" MANIFEST: Reference Manual, Built-In Functions
  2858. X.\"
  2859. X.H 1 "Built-In Functions"
  2860. XThis chapter defines each of the builtin functions of
  2861. X.IR cook .
  2862. X.P
  2863. XA builtin function is invoked by using an expression of the form
  2864. X.eB
  2865. X.fi
  2866. X.BI [ func-name
  2867. X.I arg
  2868. X.I arg
  2869. X.RB \&... ]
  2870. X.eE
  2871. Xin most places where a literal word is valid.
  2872. X.H 2 "and"
  2873. XThis function requires at least two arguments,
  2874. Xupon which it forms a logical conjunction.
  2875. XThe value returned is "1" (true) if none of the arguments are "" (false),
  2876. Xotherwise "" (false) is returned.
  2877. X.H 2 "catenate"
  2878. XThis function requires zero or more arguments.
  2879. XIf no arguments are supplied,
  2880. Xthe result is an empty word list.
  2881. XIf one or more arguments are supplied,
  2882. Xthe result is a word list of one word
  2883. Xbeing the catenation of all of the arguments.
  2884. X.H 2 "collect"
  2885. XThe arguments are interpreted as a command to be passed to the operating system.
  2886. XThe result is one word for
  2887. Xeach white-space separated word of the output of the command.
  2888. X.H 2 "collect_lines"
  2889. XThe arguments are interpreted as a command to be passed to the operating system.
  2890. XThe result one word for each
  2891. Xline of the output of the command.
  2892. X.H 2 "count"
  2893. XThis function requires zero or more arguments.
  2894. XThe result is a word list of one word containing the (decimal) length
  2895. Xof the argument word list.
  2896. X.H 2 "defined"
  2897. XThis function requires a single argument,
  2898. Xthe name of a variable to be tested for existence.
  2899. XIt returns "1" (true) if the named variable is defined and "" (false) if it
  2900. Xis not.
  2901. X.H 2 "dir"
  2902. XThis function requires one or more arguments,
  2903. Xthe names of files which will have their directory parts extracted.
  2904. XThis function may also be referred to as
  2905. X.IR dirname .
  2906. X.H 2 "downcase"
  2907. XThis function requires one or more arguments,
  2908. Xwords to be forced into lower case.
  2909. X.H 2 "entryname"
  2910. XThis function requires one or more arguments,
  2911. Xthe names of files which will have their entry name parts extracted.
  2912. X.H 2 "execute"
  2913. XThis function requires at least one argument, and
  2914. Xexecutes the command given by the arguments.
  2915. XIf the executed command returns an error code
  2916. Xthe resulting value is "" (false),
  2917. Xotherwise it is "1" (true).
  2918. X.H 2 "exists"
  2919. XThis function requires one argument,
  2920. Xbeing the name of a file to test for existence.
  2921. XThe resulting wordlist is "" (false) if the file does not exist,
  2922. Xand "1" (true) if the file does exist.
  2923. X.H 2 "find_command"
  2924. XThis function requires at least one argument,
  2925. Xbeing the names of commands to search for in $PATH.
  2926. XThe resulting word list contains either "" (false) or a fully qualified
  2927. Xpath name for each command given.
  2928. X.H 2 "fromto"
  2929. XThis function requires at least two arguments.
  2930. XFromto gives the user access to the wildcard transformations available to
  2931. X.BR cook .
  2932. XThe first argument is the "from" form,
  2933. Xthe second argument is the "to" form.
  2934. XAll other arguments are mapped from one to the other.
  2935. X.H 2 "getenv"
  2936. XEach argument is treated as the name of an environment variable.
  2937. XThe result is the value of each argument variable,
  2938. Xor "" if it does not exist.
  2939. X.H 2 "glob"
  2940. XEach argument is treated as a
  2941. X.IR sh (1)
  2942. Xfile name pattern,
  2943. Xand expanded accordingly.
  2944. X.H 2 "head"
  2945. XThis function requires zero or more arguments.
  2946. XThe wordlist returned is empty if there were no arguments,
  2947. Xor the first argument if there were arguments.
  2948. X.H 2 "if"
  2949. XThis function requires one or more arguments,
  2950. Xthe arguments before the "then" word are used as a condition.
  2951. XIf the condition is true the words between the "then" word and the
  2952. X"else" word are the result, otherwise the words after the "else" word
  2953. Xare the value.
  2954. XThe "else" clause is optional.
  2955. XThere is no way to escape the "then" and "else" words.
  2956. X.H 2 "in"
  2957. XThis function requires one or more arguments.
  2958. XThe wordlist returned is a single word: "1" (true) if the first argument is
  2959. Xequal to any of the later ones; "" (false) if not.
  2960. X.H 2 "matches"
  2961. XThis function requires one or more arguments,
  2962. Xthe first is a pattern, subsequent are strings to match against this
  2963. Xpattern.
  2964. XThe resulting wordlist contains "" (false) if did not match and "1" (true) if
  2965. Xit did.
  2966. X.H 2 "match_mask"
  2967. XThis function requires one or more arguments,
  2968. Xthe first is a pattern, subsequent are strings to match against this
  2969. Xpattern.
  2970. XThe resulting wordlist contains those arguments which mtached the pattern given
  2971. Xas the first argument.
  2972. X.H 2 "mtime"
  2973. XThis function requires one argument,
  2974. Xthe name of a file to fetch the last-modified time of.
  2975. XThe resulting wordlist is "" (false) is the file does not exist,
  2976. Xor a string containing a (comparable) representation of the date and
  2977. Xtime the files was last modified.
  2978. X.H 2 "not"
  2979. XThis function requires zero or more arguments,
  2980. Xthe value to be logically negated.
  2981. XIt returns "1" (true) if all of the arguments are "" (false),
  2982. Xor there are no arguments;
  2983. Xand returns "" (false) otherwise.
  2984. XThis is symmetric with the definition of true and false for
  2985. X.BR if .
  2986. X.H 2 "operating_system"
  2987. XThis function requires zero or more arguments.
  2988. XThe resulting wordlist contains the values of various attributes of
  2989. Xthe operating system, as named in the arguments.
  2990. XIf no attributes are named "name" is assumed.
  2991. XBelow is a list of attributes:
  2992. X.VL 1i
  2993. X.LI name
  2994. XThe generic name of the operating system
  2995. X.B cook
  2996. Xpresently being run under.
  2997. XFor example:
  2998. Xif you were running on a Berkeley 4.2BSD Unix,
  2999. Xthis would return "\f(CWunix\fP".
  3000. X.LI version
  3001. XThe specific version of operating system, within name,
  3002. X.B cook
  3003. Xis presently being run under.
  3004. XFor example: if you were running on a Berkeley 4.2BSD Unix,
  3005. Xthis would return "\f(CW4.2BSD\fP".
  3006. X.LE
  3007. XThis function may also be referred to as "os".
  3008. X.H 2 "or"
  3009. XThis function requires at least two arguments,
  3010. Xupon which it forms a logical disjunction.
  3011. XThe value returned is "1" (true) if any one of the arguments is not "" (false),
  3012. Xotherwise "" (false) is returned.
  3013. X.H 2 "pathname"
  3014. XThe function requires one or more arguments,
  3015. Xbeing files names to be replaced with their full path names.
  3016. X.H 2 "prepost"
  3017. XThis function must have at least two arguments.
  3018. XThe first argument is a prefix and the second argument is a suffix.
  3019. XThe resulting word list is
  3020. Xthe third and later arguments each given the prefix and suffix as
  3021. Xdefined by the first and second arguments.
  3022. X.H 2 "quote"
  3023. XEach argument is quoted by single quotes,
  3024. Xwith special characters escaped as necessary.
  3025. X.H 2 "resolve"
  3026. XThis builtin function is used to resolve file names when using the
  3027. X.I search_list
  3028. Xvariable to locate files.
  3029. XThis builtin function produces resolved file names as output.
  3030. XThis is useful when taking partial copies of a source
  3031. Xto perform controlled updates.
  3032. XThe targets of recipes are always cooked into the current directory.
  3033. X.H 2 "sort"
  3034. XThe arguments are sorted lexicographically.
  3035. X.H 2 "stringset"
  3036. XLogical operations are performed on sets of strings.
  3037. XThese include conjunction
  3038. X.RB ( | ),
  3039. Xdisjunction
  3040. X.RB ( & )
  3041. Xand difference
  3042. X.RB ( - ).
  3043. X.H 2 "tail"
  3044. XThis function requires zero or more arguments.
  3045. XThe word list returned will be empty if
  3046. Xthere is less than two arguments,
  3047. Xotherwise it will consist of the second and later arguments.
  3048. X.H 2 "upcase"
  3049. XThis function requires one or more arguments,
  3050. Xwords to be forced into upper case.
  3051. X.H 2 "uptodate"
  3052. XThis function requires one or more arguments,
  3053. Xfilenames to be brought up-to-date.
  3054. XThe result are true ("1") if no error occurred,
  3055. Xor false ("") if some error occurred.
  3056. END_OF_FILE
  3057. if test 8061 -ne `wc -c <'doc/builtin'`; then
  3058.     echo shar: \"'doc/builtin'\" unpacked with wrong size!
  3059. fi
  3060. # end of 'doc/builtin'
  3061. fi
  3062. if test -f 'doc/system' -a "${1}" != "-c" ; then 
  3063.   echo shar: Will not clobber existing file \"'doc/system'\"
  3064. else
  3065. echo shar: Extracting \"'doc/system'\" \(10086 characters\)
  3066. sed "s/^X//" >'doc/system' <<'END_OF_FILE'
  3067. X.\"
  3068. X.\"    cook - file construction tool
  3069. X.\"    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  3070. X.\"    All rights reserved.
  3071. X.\"
  3072. X.\"    This program is free software; you can redistribute it and/or modify
  3073. X.\"    it under the terms of the GNU General Public License as published by
  3074. X.\"    the Free Software Foundation; either version 2 of the License, or
  3075. X.\"    (at your option) any later version.
  3076. X.\"
  3077. X.\"    This program is distributed in the hope that it will be useful,
  3078. X.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
  3079. X.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3080. X.\"    GNU General Public License for more details.
  3081. X.\"
  3082. X.\"    You should have received a copy of the GNU General Public License
  3083. X.\"    along with this program; if not, write to the Free Software
  3084. X.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  3085. X.\"
  3086. X.\" MANIFEST: Reference Manual, Supplied Cookbooks
  3087. X.\"    
  3088. X.H 1 "Supplied Cookbooks"
  3089. XA number of cookbooks are supplied with 
  3090. X.BR cook .
  3091. XTo make use of one, a preprocessor directive of the form
  3092. X.eB
  3093. X#include "\f(CIwhichone\fP"
  3094. X.eE
  3095. Xmust appear the the start of your cookbook.
  3096. X.P
  3097. X.B Cook
  3098. Xdoes not have any "builtin" recipes.
  3099. XAll recipes are stored in text files,
  3100. Xso they are more easily read, understood, copied, hacked or corrected.
  3101. XThe supplied cookbooks live in the
  3102. X.I /usr/local/lib/cook
  3103. Xdirectory.
  3104. X.P
  3105. XYou may supply your own "system" recipes,
  3106. Xby placing cookbooks into a directory called
  3107. X.IR $HOME/.cook
  3108. Xor using the 
  3109. X.B -Include
  3110. Xcommand line option,
  3111. Xpossibly in your 
  3112. X.I $COOK
  3113. Xenvironment variable.
  3114. X.H 2 "as"
  3115. XThis cookbook defines how to use the assembler.
  3116. X.H 3 "recipes"
  3117. X.VL 1i
  3118. X.LI "%.o: %.s"
  3119. XConstruct object files from assembler source files.
  3120. X.LE
  3121. X.H 3 "variables"
  3122. X.VL 1i
  3123. X.LI as
  3124. XThe assembler command.
  3125. XNot altered if already defined.
  3126. X.LI as_flags
  3127. XOptions to pass the assembler command.
  3128. XNot altered if already defined.
  3129. XThe default is empty.
  3130. X.LI as_src
  3131. XAssembler source files in the current directory.
  3132. X.LI dot_src
  3133. XSource files constructable in the current directory
  3134. X(unioned with existing setting, if necessary).
  3135. X.LI dot_obj
  3136. XObject files constructable in the current directory
  3137. X(unioned with existing setting, if necessary).
  3138. X.LI dot_clean
  3139. XFiles which may be removed from the current directory in a clean target.
  3140. X.LE
  3141. X.H 2 "c"
  3142. XThis cookbook describes how to work with C files.
  3143. XInclude file dependencies are automatically determined.
  3144. X.H 3 "recipes"
  3145. X.VL 1i
  3146. X.LI "%.o: %.c"
  3147. XConstruct object files form C source files,
  3148. Xwith automatic include file dependency detection.
  3149. X.LI "%.ln: %.c"
  3150. XConstruct lint object files from C source files,
  3151. Xwith automatic include file dependency detection.
  3152. X.LE
  3153. X.H 3 "variables"
  3154. X.VL 1i
  3155. X.LI c_incl
  3156. XThe C include dependency sniffer command.
  3157. XNot altered if already defined.
  3158. X.LI cc
  3159. XThe C compiler command.
  3160. XNot altered if already defined.
  3161. X.LI lint
  3162. XThe lint command.
  3163. XNot altered if already defined.
  3164. X.LI cc_flags
  3165. XOptions to pass to the C compiler command.
  3166. XNot altered if already defined.
  3167. XThe default is "-O".
  3168. X.LI cc_include_flags
  3169. XOptions passed to the C compiler and c_incl
  3170. Xcontrolling include file searching.
  3171. XNot altered if already defined.
  3172. XThe default is empty.
  3173. X.LI cc_link_flags
  3174. XOptions passed to the C compiler when linking,
  3175. Xthese are typically library search paths and libraries.
  3176. XNot altered if already defined.
  3177. XThe default is empty.
  3178. X.LI cc_src
  3179. XC source files in the current directory.
  3180. X.LI dot_src
  3181. XSource files constructable in the current directory
  3182. X(unioned with existing setting, if necessary).
  3183. X.LI dot_obj
  3184. XObject files constructable in the current directory
  3185. X(unioned with existing setting, if necessary).
  3186. X.LI dot_clean
  3187. XFiles which may be removed from the current directory in a clean target.
  3188. X.LI dot_lint_obj
  3189. XLint object files constructable in the current directory
  3190. X(unioned with existing setting, if necessary).
  3191. X.LE
  3192. X.H 2 "home"
  3193. XThis cookbook defined where certain directories are,
  3194. Xand some common uses of those directories,
  3195. Xrelative to $HOME.
  3196. X.H 3 "variables"
  3197. X.VL 1i
  3198. X.LI home
  3199. XThe current users' home directory.
  3200. X.LI bin
  3201. XThe directory to place program binaries into.
  3202. X.LI include
  3203. XThe directory to place include files into.
  3204. X.LI lib
  3205. XThe directory to place libraries into.
  3206. X.LI cc_include_flags
  3207. XThe [include] directory is appended to the search options.
  3208. X.LI cc_link_flags
  3209. XThe [lib] directory is appended to the search options.
  3210. X.LE
  3211. X.H 2 "lex"
  3212. XThis cookbook describes how to work with lex files.
  3213. X.H 3 "recipes"
  3214. X.VL 1i
  3215. X.LI "%.l: %.c"
  3216. XConstruct C source files from lex source files.
  3217. X.LE
  3218. X.H 3 "variables"
  3219. X.VL 1i
  3220. X.LI lex
  3221. XThe lex command.
  3222. XNot altered if already defined.
  3223. X.LI lex_flags
  3224. XOptions to pass to the lex command.
  3225. XNot altered if already defined.
  3226. XThe default is empty.
  3227. X.LI lex_src
  3228. XLex source files in the current directory.
  3229. X.LI dot_src
  3230. XSource files constructable in the current directory
  3231. X(unioned with existing setting, if necessary).
  3232. X.LI dot_obj
  3233. XObject files constructable in the current directory
  3234. X(unioned with existing setting, if necessary).
  3235. X.LI dot_clean
  3236. XFiles which may be removed from the current directory in a clean target.
  3237. X.LI dot_lint_obj
  3238. XLint object files constructable in the current directory
  3239. X(unioned with existing setting, if necessary).
  3240. X.LE
  3241. X.H 2 "library"
  3242. XThis cookbook defines how to construct a library.
  3243. X.P
  3244. XIf an include file (or files) are defined for this library,
  3245. Xyou will have to append them to [install] in your
  3246. X.I Howto.cook
  3247. Xfile.
  3248. X.H 3 "variables"
  3249. X.VL 1i
  3250. X.LI all
  3251. Xtargets of the all recipe
  3252. X.LI install
  3253. Xtargets of the install recipe
  3254. X.LI me
  3255. XThe name of the library to be constructed.
  3256. XDefaults to the last component of the pathname of the current directory.
  3257. X.LI ar
  3258. XThe archive command.
  3259. X.LI install
  3260. Xtargets of the install command.
  3261. XOnly defined if the [lib] variable is defined.
  3262. X.LE
  3263. X.H 3 "recipes"
  3264. X.VL 1i
  3265. X.LI all
  3266. Xconstruct the targets defined in [all].
  3267. X.LI clean
  3268. Xremove the files named in [dot_clean].
  3269. X.LI clobber
  3270. Xremove the files name in [dot_clean] and [all].
  3271. X.LI install
  3272. XConstruct the files named in [install].
  3273. XOnly defined if the [lib] variable is defined.
  3274. X.LI uninstall
  3275. XRemove the files named in [install].
  3276. XOnly defined if the [lib] variable is defined.
  3277. X.LE
  3278. X.H 2 "print"
  3279. XThis cookbook is used to print files.
  3280. XIt will almost certainly need to be changed for every site.
  3281. X.H 3 "recipes"
  3282. X.VL 1i
  3283. X.LI "%.lw: %.ps"
  3284. XPrint a PostScript file.
  3285. X.LI "%.lp: %"
  3286. XPrint a text file.
  3287. X.LE
  3288. X.H 3 "variables"
  3289. X.VL 1i
  3290. X.LI lp
  3291. XThe print command.
  3292. XNot altered if already defined.
  3293. X.LI lp_flags
  3294. XOptions passed to the print command.
  3295. XNot altered if already defined.
  3296. XDefaults to empty.
  3297. X.LE
  3298. X.H 2 "program"
  3299. XThis cookbook defines how to construct a program.
  3300. X.P
  3301. XIf you program uses any libraries,
  3302. Xyou will have to append them to [cc_link_flags] in your
  3303. X.I Howto.cook
  3304. Xfile.
  3305. X.H 3 "variables"
  3306. X.VL 1i
  3307. X.LI all
  3308. XTargets of the all recipe.
  3309. X.LI install
  3310. Xtargets of the install recipe
  3311. X.LI me
  3312. XThe name of the program to be constructed.
  3313. XDefaults to the last component of the pathname of the current directory.
  3314. X.LI install
  3315. Xtargets of the install command.
  3316. X.LE
  3317. X.H 3 "recipes"
  3318. X.VL 1i 
  3319. X.LI all
  3320. XConstruct the targets named in [all].
  3321. X.LI clean
  3322. XRemove the files named in [dot_clean].
  3323. X.LI clobber
  3324. XRemove the files named in [dot_clean] and [all].
  3325. X.LI install
  3326. XConstruct the files named in [install].
  3327. XOnly defined if the [lib] variable is defined.
  3328. X.LI uninstall
  3329. XRemove the files named in [install].
  3330. XOnly defined if the [lib] variable is defined.
  3331. X.LE
  3332. X.H 2 "sccs"
  3333. XThis cookbook is used to extract files from SCCS.
  3334. X.H 3 "recipes"
  3335. X.VL 1i
  3336. X.LI "%: SCCS/s.%"
  3337. XExtract files from SCCS.
  3338. X.LE
  3339. X.H 3 "variables"
  3340. X.VL 1i
  3341. X.LI get
  3342. XThe sccs get command.
  3343. X.LE
  3344. X.H 2 "text"
  3345. XThis cookbook is used to process text documents.
  3346. X.P
  3347. XInclude file dependencies are automatically detected.
  3348. XThe requirements for various preprocessors are automatically detected
  3349. X(eg eqn, tbl, pic, graf).
  3350. X.H 3 "recipes"
  3351. X.VL 1i
  3352. X.LI "%.ps: %.t"
  3353. XPostScript for generic *roff source.
  3354. X.LI "%: %.t"
  3355. XStraight text from *roff source.
  3356. X.LE
  3357. X.H 3 "variables"
  3358. X.VL 1i 
  3359. X.LI text_incl
  3360. XThe text_incl command (finds include dependencies).
  3361. XNot altered if already set.
  3362. X.LI text_roff
  3363. XThe text_roff command (finds preprocessor requirements).
  3364. XNot altered if already set.
  3365. X.LI roff_flags
  3366. XArguments passed to text_roff, and indirectly to the *roff program.
  3367. XNot altered if already set.
  3368. XDefaults to empty.
  3369. X.LE
  3370. X.H 2 "usr"
  3371. XThis cookbook defined where certain directories are,
  3372. Xrelative to /usr.
  3373. X.H 3 "variables"
  3374. X.VL 1i
  3375. X.LI bin
  3376. XThe directory to place program binaries into.
  3377. X.LI include
  3378. XThe directory to place include files into.
  3379. X.LI lib
  3380. XThe directory to place libraries into.
  3381. X.LE
  3382. X.H 2 "usr.local"
  3383. XThis cookbook defined where certain directories are,
  3384. Xand some common uses of those directories,
  3385. Xelative to /usr/local.
  3386. X .H 3 "variables"
  3387. X.VL 1i
  3388. X.LI bin
  3389. XThe directory to place program binaries into.
  3390. X.LI include
  3391. XThe directory to place include files into.
  3392. X.LI lib
  3393. XThe directory to place libraries into.
  3394. X.LI cc_include_flags
  3395. XThe [include] directory is added to the search options.
  3396. X.LI cc_link_flags
  3397. XThe [lib] directory is added to the search options.
  3398. X.LE
  3399. X.H 2 "yacc"
  3400. XThis cookbook describes how to use yacc.
  3401. X.P
  3402. XYou will have to add "-d" to the [yacc_flags] variable
  3403. Xif you want %.h files generated.
  3404. X.P
  3405. XIf a
  3406. X.I y.output
  3407. Xfile is constructed,
  3408. Xit will be moved to
  3409. X.IR %.list .
  3410. X.H 3 "recipes"
  3411. X.VL 1i
  3412. X.LI "%.c %.h: %.y"
  3413. XConstruct C source and header files from yacc source files.
  3414. XApplied if -d in [yacc_flags].
  3415. X.LI "%.c: %.y"
  3416. XConstruct C source files from yacc source files.
  3417. XApplied if -d not in [yacc_flags].
  3418. X.LE
  3419. X.H 3 "variables"
  3420. X.VL 1i
  3421. X.LI yacc_src
  3422. XYacc source files in the current directory.
  3423. X.LI dot_src
  3424. XSource files constructable in the current directory
  3425. X(unioned with existing setting, if necessary).
  3426. X.LI dot_obj
  3427. XObject files constructable in the current directory
  3428. X(unioned with existing setting, if necessary).
  3429. X.LI dot_clean
  3430. XFiles which may be removed from the current directory in a clean target.
  3431. X.LI dot_lint_obj
  3432. XLint object files constructable in the current directory
  3433. X(unioned with existing setting, if necessary).
  3434. X.LE
  3435. X.H 2 "yacc_many"
  3436. XThis cookbook describes how to use yacc.
  3437. XThe difference with the "yacc" cookbook is that this cookbook
  3438. Xallows you to have more that one yacc generated parser in the same
  3439. Xprogram, by using the classic sed(1) hack of the output.
  3440. END_OF_FILE
  3441. if test 10086 -ne `wc -c <'doc/system'`; then
  3442.     echo shar: \"'doc/system'\" unpacked with wrong size!
  3443. fi
  3444. # end of 'doc/system'
  3445. fi
  3446. if test -f 'roffpp/preprocess.c' -a "${1}" != "-c" ; then 
  3447.   echo shar: Will not clobber existing file \"'roffpp/preprocess.c'\"
  3448. else
  3449. echo shar: Extracting \"'roffpp/preprocess.c'\" \(8282 characters\)
  3450. sed "s/^X//" >'roffpp/preprocess.c' <<'END_OF_FILE'
  3451. X/*
  3452. X *    cook - file construction tool
  3453. X *    Copyright (C) 1992, 1993 Peter Miller.
  3454. X *    All rights reserved.
  3455. X *
  3456. X *    This program is free software; you can redistribute it and/or modify
  3457. X *    it under the terms of the GNU General Public License as published by
  3458. X *    the Free Software Foundation; either version 2 of the License, or
  3459. X *    (at your option) any later version.
  3460. X *
  3461. X *    This program is distributed in the hope that it will be useful,
  3462. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  3463. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3464. X *    GNU General Public License for more details.
  3465. X *
  3466. X *    You should have received a copy of the GNU General Public License
  3467. X *    along with this program; if not, write to the Free Software
  3468. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  3469. X *
  3470. X * MANIFEST: functions to eliminate include files
  3471. X */
  3472. X
  3473. X#include <ctype.h>
  3474. X#include <stdio.h>
  3475. X#include <stdlib.h>
  3476. X#include <unistd.h>
  3477. X
  3478. X#include <error.h>
  3479. X#include <mem.h>
  3480. X#include <preprocess.h>
  3481. X#include <str.h>
  3482. X#include <trace.h>
  3483. X#include <word.h>
  3484. X
  3485. Xstatic    wlist    search;
  3486. Xstatic    char    *ofn;
  3487. Xstatic    FILE    *ofp;
  3488. X
  3489. X
  3490. X/*
  3491. X * NAME
  3492. X *    preprocess_include
  3493. X *
  3494. X * SYNOPSIS
  3495. X *    void preprocess_include(char *path);
  3496. X *
  3497. X * DESCRIPTION
  3498. X *    The preprocess_include function is used to append
  3499. X *    to the include search path.
  3500. X *
  3501. X * ARGUMENTS
  3502. X *    path    - path to append
  3503. X */
  3504. X
  3505. Xvoid
  3506. Xpreprocess_include(path)
  3507. X    char        *path;
  3508. X{
  3509. X    string_ty    *s;
  3510. X
  3511. X    trace(("preprocess_include(path = \"%s\")\n{\n"/*}*/, path));
  3512. X    s = str_from_c(path);
  3513. X    wl_append_unique(&search, s);
  3514. X    str_free(s);
  3515. X    trace((/*{*/"}\n"));
  3516. X}
  3517. X
  3518. X
  3519. X/*
  3520. X * NAME
  3521. X *    source
  3522. X *
  3523. X * SYNOPSIS
  3524. X *    int source(char *line);
  3525. X *
  3526. X * DESCRIPTION
  3527. X *    The source function is used to test if a line of tect is
  3528. X *    a .so directive, and to insert the contents of the sourced
  3529. X *    file at this point.
  3530. X *
  3531. X * ARGUMENTS
  3532. X *    line    - pointer to line of text
  3533. X *
  3534. X * RETURNS
  3535. X *    int;    zero if is not a .so directive,
  3536. X *        non-zero if it is a .so directive
  3537. X */
  3538. X
  3539. Xstatic void scan _((string_ty *)); /* forward */
  3540. X
  3541. Xstatic int source _((char *));
  3542. X
  3543. Xstatic int
  3544. Xsource(line)
  3545. X    char        *line;
  3546. X{
  3547. X    string_ty    *filename;
  3548. X    size_t        j;
  3549. X    int        result;
  3550. X    char        *ep;
  3551. X    static string_ty *dot;
  3552. X
  3553. X    /*
  3554. X     * see if this is a .so directive
  3555. X     */
  3556. X    if (*line != '.')
  3557. X        return 0;
  3558. X    trace(("source(line = \"%s\")\n{\n"/*}*/, line));
  3559. X    result = 0;
  3560. X    line++;
  3561. X    while (isspace(*line))
  3562. X        line++;
  3563. X    if (line[0] != 's' || line[1] != 'o' || !isspace(line[2]))
  3564. X        goto ret;
  3565. X    line += 3;
  3566. X    while (isspace(*line))
  3567. X        line++;
  3568. X    if (!*line)
  3569. X        goto ret;
  3570. X
  3571. X    /*
  3572. X     * find the end of the argument
  3573. X     */
  3574. X    for (ep = line + 1; *ep && !isspace(*ep); ++ep)
  3575. X        ;
  3576. X    filename = str_n_from_c(line, ep - line);
  3577. X
  3578. X    /*
  3579. X     * no need to search when it's an absolute path
  3580. X     */
  3581. X    if (*line == '/')
  3582. X    {
  3583. X        scan(filename);
  3584. X        str_free(filename);
  3585. X        result = 1;
  3586. X        goto ret;
  3587. X    }
  3588. X
  3589. X    /*
  3590. X     * search for the name in the search list
  3591. X     */
  3592. X    if (!dot)
  3593. X        dot = str_from_c(".");
  3594. X    for (j = 0; j < search.wl_nwords; ++j)
  3595. X    {
  3596. X        string_ty    *s;
  3597. X        string_ty    *dir;
  3598. X
  3599. X        dir = search.wl_word[j];
  3600. X        if (str_equal(dir, dot))
  3601. X            s = str_copy(filename);
  3602. X        else
  3603. X            s = str_format("%S/%S", dir, filename);
  3604. X        if (access(s->str_text, F_OK) == 0)
  3605. X        {
  3606. X            str_free(filename);
  3607. X            scan(s);
  3608. X            str_free(s);
  3609. X            result = 1;
  3610. X            goto ret;
  3611. X        }
  3612. X        str_free(s);
  3613. X    }
  3614. X    str_free(filename);
  3615. X
  3616. X    /*
  3617. X     * let {ps,n,t,dit,pt}roff bomb later
  3618. X     */
  3619. X    result = 0;
  3620. X
  3621. X    /*
  3622. X     * here for all exits
  3623. X     */
  3624. X    ret:
  3625. X    trace(("return %d;\n", result));
  3626. X    trace((/*{*/"}\n"));
  3627. X    return result;
  3628. X}
  3629. X
  3630. X/*
  3631. X * NAME
  3632. X *    lf_directive
  3633. X *
  3634. X * SYNOPSIS
  3635. X *    int lf_directive(char *line, string_ty **ifn, long *lino);
  3636. X *
  3637. X * DESCRIPTION
  3638. X *    The lf_directive function is used to test if a line of text is
  3639. X *    a .lf directive, and to adjust the file position to this point.
  3640. X *
  3641. X * ARGUMENTS
  3642. X *    line    - pointer to line of text
  3643. X *    ifn    - file name (ptr) if needs changing
  3644. X *    lino    - line number (ptr) if needs changing
  3645. X *
  3646. X * RETURNS
  3647. X *    int;    zero if is not a .so directive,
  3648. X *        non-zero if it is a .so directive
  3649. X */
  3650. X
  3651. Xstatic int lf_directive _((char *line, string_ty **ifn, long *lino));
  3652. X
  3653. Xstatic int
  3654. Xlf_directive(line, ifn, lino)
  3655. X    char        *line;
  3656. X    string_ty    **ifn;
  3657. X    long        *lino;
  3658. X{
  3659. X    int        result;
  3660. X    long        n;
  3661. X    string_ty    *s;
  3662. X    char        *ep;
  3663. X
  3664. X    /*
  3665. X     * see if this is a .so directive
  3666. X     */
  3667. X    if (*line != '.')
  3668. X        return 0;
  3669. X    trace(("source(line = \"%s\")\n{\n"/*}*/, line));
  3670. X    result = 0;
  3671. X    line++;
  3672. X    while (isspace(*line))
  3673. X        line++;
  3674. X    if (line[0] != 'l' || line[1] != 'f' || !isspace(line[2]))
  3675. X        goto ret;
  3676. X    line += 3;
  3677. X    while (isspace(*line))
  3678. X        line++;
  3679. X    if (!*line)
  3680. X        goto ret;
  3681. X
  3682. X    /*
  3683. X     * find the line number
  3684. X     */
  3685. X    for (ep = line + 1; *ep && !isspace(*ep); ++ep)
  3686. X        ;
  3687. X    s = str_n_from_c(line, ep - line);
  3688. X    n = atol(s->str_text);
  3689. X    str_free(s);
  3690. X    if (n <= 0)
  3691. X        goto ret;
  3692. X    *lino = n - 1;
  3693. X    result = 1;
  3694. X
  3695. X    /*
  3696. X     * find the file name
  3697. X     */
  3698. X    line = ep;
  3699. X    while (*line && isspace(*line))
  3700. X        line++;
  3701. X    if (!*line)
  3702. X        goto ret;
  3703. X    for (ep = line + 1; *ep && !isspace(*ep); ++ep)
  3704. X        ;
  3705. X    s = str_n_from_c(line, ep - line);
  3706. X    if (*ifn)
  3707. X        str_free(*ifn);
  3708. X    *ifn = s;
  3709. X
  3710. X    /*
  3711. X     * here for all exits
  3712. X     */
  3713. X    ret:
  3714. X    trace(("return %d;\n", result));
  3715. X    trace((/*{*/"}\n"));
  3716. X    return result;
  3717. X}
  3718. X
  3719. X
  3720. X/*
  3721. X * NAME
  3722. X *    resync
  3723. X *
  3724. X * SYNOPSOS
  3725. X *    void resync(FILE *fp, char *name, long line);
  3726. X *
  3727. X * DESCRIPTION
  3728. X *    The resync function is used to emit appropriate
  3729. X *    *roff requests to resynchronize the *roff engine
  3730. X *    to the correct file name and line numner,
  3731. X *    so that error messages, etc al, are meaningful.
  3732. X *
  3733. X * ARGUMENTS
  3734. X *    fp    - file stream to print on
  3735. X *    name    - name of input file
  3736. X *    line    - num number in the input file
  3737. X */
  3738. X
  3739. Xstatic void resync _((FILE *, string_ty *, long));
  3740. X
  3741. Xstatic void
  3742. Xresync(ofp, file, line)
  3743. X    FILE        *ofp;
  3744. X    string_ty    *file;
  3745. X    long        line;
  3746. X{
  3747. X    fprintf(ofp, ".lf %ld %s\n", line, file->str_text);
  3748. X}
  3749. X
  3750. X
  3751. X/*
  3752. X * NAME
  3753. X *    scan
  3754. X *
  3755. X * SYNOPSIS
  3756. X *    void scan(char *path);
  3757. X *
  3758. X * DESCRIPTION
  3759. X *    The scan function is used to can a file, copying its contents
  3760. X *    to the output, replacing .so directives with the contents of
  3761. X *    the included files.
  3762. X *
  3763. X * ARGUMENTS
  3764. X *    path    - name of file to scan
  3765. X */
  3766. X
  3767. Xstatic void scan _((string_ty *));
  3768. X
  3769. Xstatic void
  3770. Xscan(ifn)
  3771. X    string_ty    *ifn;
  3772. X{
  3773. X    FILE        *ifp;
  3774. X    size_t        pos;
  3775. X    static size_t    max;
  3776. X    static char    *line;
  3777. X    long        lino;
  3778. X    int        c;
  3779. X    string_ty    *ifn2;
  3780. X
  3781. X    trace(("scan(ifn = \"%s\")\n{\n"/*}*/, ifn ? ifn->str_text : "-"));
  3782. X    if (ifn)
  3783. X    {
  3784. X        ifp = fopen(ifn->str_text, "r");
  3785. X        if (!ifp)
  3786. X            nfatal("open \"%s\"", ifn->str_text);
  3787. X    }
  3788. X    else
  3789. X    {
  3790. X        ifn = str_from_c("(stdin)");
  3791. X        ifp = stdin;
  3792. X    }
  3793. X    ifn2 = str_copy(ifn);
  3794. X
  3795. X    lino = 1;
  3796. X    resync(ofp, ifn2, lino);
  3797. X
  3798. X    pos = 0;
  3799. X    for (;;)
  3800. X    {
  3801. X        if (pos >= max)
  3802. X        {
  3803. X            if (!line)
  3804. X            {
  3805. X                max = 100;
  3806. X                line = mem_alloc(max);
  3807. X            }
  3808. X            else
  3809. X            {
  3810. X                max += 80;
  3811. X                mem_change_size(&line, max);
  3812. X            }
  3813. X        }
  3814. X        c = getc(ifp);
  3815. X        switch (c)
  3816. X        {
  3817. X        case EOF:
  3818. X            if (ferror(ifp))
  3819. X                nfatal("read \"%s\"", ifn->str_text);
  3820. X            if (!pos)
  3821. X                break;
  3822. X            /* fall through... */
  3823. X
  3824. X        case '\n':
  3825. X            line[pos] = 0;
  3826. X            if (source(line) || lf_directive(line, &ifn2, &lino))
  3827. X                resync(ofp, ifn2, lino + 1);
  3828. X            else
  3829. X            {
  3830. X                fputs(line, ofp);
  3831. X                putc('\n', ofp);
  3832. X            }
  3833. X            if (ferror(ofp))
  3834. X                nfatal("write \"%s\"", ofn);
  3835. X            lino++;
  3836. X            pos = 0;
  3837. X            continue;
  3838. X
  3839. X        default:
  3840. X            line[pos++] = c;
  3841. X            continue;
  3842. X        }
  3843. X        break;
  3844. X    }
  3845. X
  3846. X    if (ifp != stdin && fclose(ifp))
  3847. X        nfatal("close \"%s\"", ifn);
  3848. X    str_free(ifn2);
  3849. X    trace((/*{*/"}\n"));
  3850. X}
  3851. X
  3852. X
  3853. X/*
  3854. X * NAME
  3855. X *    preprocess
  3856. X *
  3857. X * SYNOPSIS
  3858. X *    void preprocess(char *infile, char *outfile);
  3859. X *
  3860. X * DESCRIPTION
  3861. X *    The preprocess function is used to process an *roff file and
  3862. X *    eliminate the .so directives, replacing them with the contents
  3863. X *    of the included files.
  3864. X *
  3865. X * ARGUMENTS
  3866. X *    infile    - name of file to scan, NULL means stdin
  3867. X *    outfile    - name of file to hold result, NULL means stdout
  3868. X */
  3869. X
  3870. Xvoid
  3871. Xpreprocess(ifile, ofile)
  3872. X    char        *ifile;
  3873. X    char        *ofile;
  3874. X{
  3875. X    string_ty    *s;
  3876. X
  3877. X    /*
  3878. X     * default the search path iff the user specified nothing
  3879. X     */
  3880. X    trace(("preprocess(ifile = \"%s\", ofile = \"%s\")\n{\n"/*}*/,
  3881. X        ifile ? ifile : "-", ofile ? ofile : "-"));
  3882. X    if (!search.wl_nwords)
  3883. X        preprocess_include(".");
  3884. X
  3885. X    /*
  3886. X     * open the output file
  3887. X     */
  3888. X    if (ofile)
  3889. X    {
  3890. X        ofn = ofile;
  3891. X        ofp = fopen(ofn, "w");
  3892. X        if (!ofp)
  3893. X            nfatal("create \"%s\"", ofn);
  3894. X    }
  3895. X    else
  3896. X    {
  3897. X        ofn = "(stdout)";
  3898. X        ofp = stdout;
  3899. X    }
  3900. X
  3901. X    /*
  3902. X     * scan the input
  3903. X     */
  3904. X    if (ifile)
  3905. X        s = str_from_c(ifile);
  3906. X    else
  3907. X        s = 0;
  3908. X    scan(s);
  3909. X    if (s)
  3910. X        str_free(s);
  3911. X
  3912. X    /*
  3913. X     * close up and go home
  3914. X     */
  3915. X    if (ofp != stdout && fclose(ofp))
  3916. X        nfatal("close \"%s\"", ofn);
  3917. X    trace((/*{*/"}\n"));
  3918. X}
  3919. END_OF_FILE
  3920. if test 8282 -ne `wc -c <'roffpp/preprocess.c'`; then
  3921.     echo shar: \"'roffpp/preprocess.c'\" unpacked with wrong size!
  3922. fi
  3923. # end of 'roffpp/preprocess.c'
  3924. fi
  3925. echo shar: End of archive 5 \(of 11\).
  3926. cp /dev/null ark5isdone
  3927. MISSING=""
  3928. for I in 1 2 3 4 5 6 7 8 9 10 11 ; do
  3929.     if test ! -f ark${I}isdone ; then
  3930.     MISSING="${MISSING} ${I}"
  3931.     fi
  3932. done
  3933. if test "${MISSING}" = "" ; then
  3934.     echo You have unpacked all 11 archives.
  3935.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  3936. else
  3937.     echo You still need to unpack the following archives:
  3938.     echo "        " ${MISSING}
  3939. fi
  3940. ##  End of shell archive.
  3941. exit 0
  3942.